21xrx.com
2025-04-14 15:18:08 Monday
文章检索 我的文章 写文章
C++并发编程之队列操作
2023-07-04 23:31:34 深夜i     14     0
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教程

评论区