21xrx.com
2025-03-22 17:50:24 Saturday
文章检索 我的文章 写文章
C++实现queue阻塞等待元素的方法
2023-07-05 08:38:08 深夜i     --     --
C++ queue 阻塞 等待 元素

在使用 C++ 中的 queue 的时候,我们常常会遇到需要等待队列中元素被添加的情况。当队列为空时,我们希望程序能够等待队列中有元素再进行操作,这就需要用到阻塞等待元素的方法。

具体实现方法如下:

1. 首先,我们需要定义一个互斥量 mutex 和一个条件变量 cond_var 来保证线程安全。我们需要用 mutex 来保证同一时刻只有一个线程在访问队列,而使用 cond_var 来阻塞等待队列中有元素。

2. 当队列为空时,我们使用 cond_var 的 wait 函数来阻塞等待队列中有元素。这个函数会阻塞当前线程,并在队列中添加新元素时被唤醒。

3. 当队列中添加了新元素时,我们使用 cond_var 的 notify_one() 函数来唤醒一个等待的线程,这样被唤醒的线程就可以继续执行。

示例代码如下:

#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> my_queue;
std::mutex my_mutex;
std::condition_variable my_cond_var;
void consumer()
{
  while (true) {
    std::unique_lock<std::mutex> lock(my_mutex);
    my_cond_var.wait(lock, []{ return !my_queue.empty(); });
    int elem = my_queue.front();
    my_queue.pop();
    lock.unlock();
    // do something with elem
  }
}
void producer()
{
  while (true) {
    int elem = 42;
    {
      std::lock_guard<std::mutex> lock(my_mutex);
      my_queue.push(elem);
    }
    my_cond_var.notify_one();
  }
}

在这个示例代码中,我们定义了两个函数,一个是消费者函数 consumer(),另一个是生产者函数 producer()。当队列为空时,消费者线程将阻塞等待,直到队列中有元素。而生产者线程则不断往队列中添加元素,添加完成后使用 notify_one() 函数唤醒消费者线程。

总体来说,C++ 中的阻塞等待方法需要使用线程的互斥量和条件变量来实现。通过这样的方式,我们可以很方便地实现对队列元素的阻塞等待。

  
  

评论区