21xrx.com
2024-12-22 21:01:56 Sunday
登录
文章检索 我的文章 写文章
C++并发编程之队列操作
2023-07-04 23:31:34 深夜i     --     --
C++ 并发编程 队列操作

队列是并发编程中常用的数据结构之一。在C++中,队列操作可以通过标准库中的std::queue来实现,但是std::queue是非线程安全的,因此在并发编程中需要使用std::queue的线程安全版本——std::queue队列。

std::queue队列是通过std::mutex和std::condition_variable实现线程安全的。std::mutex用于保护队列的访问,保证同一时间只有一个线程可以访问队列。std::condition_variable用于实现线程之间的同步。当队列为空时,获取队列元素的线程会被阻塞,等待有元素插入队列后再唤醒。

以下是一个使用std::queue队列实现生产者-消费者模型的示例:


#include <queue>

#include <thread>

#include <mutex>

#include <condition_variable>

std::queue<int> q;

std::mutex mtx;

std::condition_variable cv;

void producer() {

  for (int i = 0; i < 100; ++i) {

    std::unique_lock<std::mutex> lock(mtx);

    q.push(i);

    lock.unlock();

    cv.notify_one(); // 唤醒一个消费者线程

  }

}

void consumer() {

  while (true) {

    std::unique_lock<std::mutex> lock(mtx);

    if (!q.empty()) { // 队列非空,取出队首元素

      int x = q.front();

      q.pop();

      lock.unlock();

      std::cout << "consumed " << x << std::endl;

    } else { // 队列为空,等待

      cv.wait(lock);

    }

  }

}

int main() {

  std::thread p(producer);

  std::thread c1(consumer);

  std::thread c2(consumer);

  p.join();

  c1.join();

  c2.join();

  return 0;

}

在上述代码中,producer线程不断往队列中插入元素,consumer线程不断从队列中取出元素进行消费。多个consumer线程可以同时竞争获取队列元素,而当队列为空时,它们会被阻塞直到有元素可用。

通过以上示例,我们可以看出使用std::queue队列实现线程安全的队列操作是十分方便的。在实际的并发编程中,std::queue队列可以被用于实现各种并发模型,如线程池、消息队列等。同时,我们需要注意std::queue队列的使用方法,尤其是在多线程环境下需要保证线程安全,避免出现数据竞争和其他问题。

  
  
下一篇: C++连接ODBC教程

评论区

{{item['qq_nickname']}}
()
回复
回复