21xrx.com
2024-12-22 23:43:34 Sunday
登录
文章检索 我的文章 写文章
C++多线程访问队列的实现方法
2023-06-29 09:21:03 深夜i     --     --
C++ 多线程 队列 访问 实现方法

C++语言作为一种高效、面向对象的编程语言,提供了丰富的多线程编程支持。在实际开发中,经常需要用队列来实现线程间的通信,因此掌握C++多线程访问队列的实现方法非常重要。

1. 使用锁来保护队列

在多线程访问同一队列时,需要使用锁来保证线程安全。可以使用C++11标准库提供的std::mutex和std::lock_guard来实现锁保护。

std::mutex mutex;

std::queue task_queue;

void producer() {

  int task = produce_task();

  std::lock_guard lock(mutex);

  task_queue.push(task);

}

void consumer() {

  int task;

  {

    std::lock_guard lock(mutex);

    if (task_queue.empty())

      return;

    task = task_queue.front();

    task_queue.pop();

  }

  process_task(task);

}

2. 使用条件变量来实现线程同步

除了锁保护,还可以使用条件变量来实现线程同步。当队列为空时,消费者线程需要等待直到队列非空,生产者线程向队列中添加任务后,需要通知消费者线程。

std::mutex mutex;

std::queue task_queue;

std::condition_variable cond;

void producer() {

  int task = produce_task();

  {

    std::lock_guard lock(mutex);

    task_queue.push(task);

  }

  cond.notify_all();

}

void consumer() {

  int task;

  {

    std::unique_lock lock(mutex);

    cond.wait(lock, [&]() { return !task_queue.empty(); });

    task = task_queue.front();

    task_queue.pop();

  }

  process_task(task);

}

3. 使用同步队列等待任务

在一些情况下,需要实现一个同步队列,等待队列中的任务完成后再继续执行下一步操作。可以使用C++标准库提供的std::condition_variable和std::atomic_bool来实现。

std::mutex mutex;

std::queue > task_queue;

std::condition_variable cond;

std::atomic_bool done(false);

void worker() {

  while (!done) {

    std::function task;

    {

      std::unique_lock lock(mutex);

      cond.wait(lock, [&]() { return !task_queue.empty(); });

      task = task_queue.front();

      task_queue.pop();

    }

    task();

  }

}

void main_thread() {

  std::thread t(worker);

  produce_tasks();

  done = true;

  cond.notify_all();

  t.join();

}

在上面的代码中,worker函数是一个消费者线程,用于执行队列中的任务。main_thread函数则是主线程,用于向队列中生产任务。当所有任务执行完成后,done变量设置为true,通知消费者线程结束运行。

  
  

评论区

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