21xrx.com
2024-12-22 21:43:43 Sunday
登录
文章检索 我的文章 写文章
C++11条件变量的使用方法
2023-07-04 22:19:28 深夜i     --     --
C++11 条件变量 使用方法

C++11中的条件变量被广泛应用于多线程中,它可以实现线程的同步和互斥操作。通过条件变量,一个线程可以阻塞自己,等待条件变量被唤醒后再继续执行。下面介绍一下条件变量的基本使用方法。

1.定义条件变量并初始化


std::condition_variable cv;

2.定义互斥变量并初始化


std::mutex mutex;

3.创建等待者线程和通知者线程

一般来说,条件变量是由某个线程等待和通知的,不同的线程需要使用不同的条件变量。等待者线程在等待条件变量的时候会锁定互斥变量,而通知者线程在通知条件变量的时候也需要锁定同一个互斥变量。

等待者线程的代码:


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

cv.wait(lock);

这里调用了条件变量的wait()方法来等待条件变量被唤醒,wait()方法会释放互斥锁,并阻塞当前线程。等待者线程会在此处等待,直到条件变量被通知。

通知者线程的代码:


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

cv.notify_one();

这里调用了条件变量的notify_one()方法来唤醒等待者线程,notify_one()方法会唤醒一个等待的线程。通知者线程必须先获得互斥锁,然后再通知条件变量,这样等待者线程才能获取到锁并继续执行。

4.使用条件变量实现线程池

条件变量可以方便地实现一个基本的线程池,线程池会使用一个任务队列来管理一组任务,空闲的线程会等待任务队列中的任务,然后执行这些任务。

等待者线程的代码:


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

while (taskQueue.empty()) {

  cv.wait(lock);

}

Task task = taskQueue.front();

taskQueue.pop();

lock.unlock();

task();

通知者线程的代码:


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

taskQueue.push(task);

lock.unlock();

cv.notify_one();

在这个示例中,等待者线程会在队列为空时等待条件变量被唤醒,然后获取队列中的第一个任务并执行它。通知者线程会将新任务加入队列并唤醒等待者线程。

总结

条件变量是多线程编程中必不可少的工具之一。在使用条件变量的时候,需要注意互斥锁的使用,以防死锁问题的发生。另外,条件变量也可以与其他同步工具(如信号量、计数器等)结合使用,以实现更复杂的多线程同步和互斥操作。

  
  

评论区

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