C++ wait/notify机制
2021/7/13 22:08:44
本文主要是介绍C++ wait/notify机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++ wait/notify机制
- C++ wait/notify机制
- instance analysis
C++ wait/notify机制
notify_one:唤醒等待线程中的一个,唤醒的线程顺序执行。
notify_all:唤醒所有等待的线程,唤醒的线程抢占式执行。
wait:等待。需要其它的接口来唤醒。
instance analysis
#include <iostream> #include <thread> #include <condition_variable> #include <mutex>//demo #include <unistd.h> std::mutex mtx_syn; std::condition_variable cv_syn; std::condition_variable cv_syn_1; bool ready = false;//线程A void threadA(int id) { while (1) { std::unique_lock<std::mutex> lck(mtx_syn); while (!ready) { cv_syn.wait(lck); } // ... std::cout << "threadA " << id << '\n'; usleep(500*1000); cv_syn.notify_one(); // 唤醒等待线程中的一个 cv_syn.wait(lck); // 等待 } }// 线程B void threadB(int id) { while (1) { //新创建的 unique_lock 对象管理 Mutex 对象 m,并尝试调用 m.lock() 对 Mutex 对象进行上锁,如果此时另外某个 unique_lock 对象已经管理了该 Mutex 对象 m,则当前线程将会被阻塞 std::unique_lock<std::mutex> lck(mtx_syn); while (!ready) { cv_syn.wait(lck); } // ... std::cout << "threadB " << id << '\n'; usleep(500*1000); cv_syn.notify_one();// 唤醒等待线程中的一个 cv_syn.wait(lck); } } // 线程C void threadC(int id) { while (1) { std::unique_lock<std::mutex> lck(mtx_syn); while (!ready) cv_syn.wait(lck); // ... std::cout << "threadC " << id << '\n'; usleep(500*1000); cv_syn.notify_one(); // 唤醒等待线程中的一个线程 cv_syn.wait(lck); } } void go() { std::unique_lock<std::mutex> lck(mtx_syn); ready = true; //cv_syn.notify_one(); // 唤醒等待线程中的一个线程,notify_one()唤醒的线程顺序执行 cv_syn.notify_all(); //唤醒的线程抢占式知性 } int main() { //线程同步 std::thread threads[5]; threads[0] = std::thread(threadA, 0); threads[1] = std::thread(threadB, 1); threads[2] = std::thread(threadC, 2); std::cout << "3 threads ready to race...\n"; go(); // go! for (auto& th : threads) th.join(); }
g++ main.cpp -o main -std=c++11 -lpthread
这篇关于C++ wait/notify机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解