【c++】mutex condition_variable 自定义信号量的应用和使用
2021/4/17 1:25:53
本文主要是介绍【c++】mutex condition_variable 自定义信号量的应用和使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
//mutex condition_variable 自定义信号量的使用 #include <iostream> #include <thread> #include <mutex> #include <windows.h> #include <condition_variable> #include <queue> using namespace std; //1. 信号量使用 一个线程打印A 一个线程打印B namespace jack { class semaphore { public:semaphore(const int& init = 1):count(init), wakeups(0){} void wait() { unique_lock<mutex> lock(mtx); if (--count < 0) { condition.wait(lock, [&]()->bool {return wakeups > 0; }); --wakeups; } } void post() { unique_lock<mutex> lock(mtx); if (++count <= 0) { ++wakeups; condition.notify_one(); } } private: int count; int wakeups; mutex mtx; condition_variable condition; }; } jack::semaphore sem(1); jack::semaphore sA(1); jack::semaphore sB(0); void PrintA(int i) { while (true) { //死锁 /*lock_guard<mutex> guard1(mtxA); cout << "a" << endl; this_thread::sleep_for(chrono::milliseconds(100)); lock_guard<mutex> guard2(mtxB);*/ //锁无法解决这个问题 sA.wait(); sem.wait(); cout << "a" << endl; this_thread::sleep_for(chrono::milliseconds(100)); sem.post(); sB.post(); } } void PrintB(int i) { while (true) { //死锁 /*lock_guard<mutex> guard1(mtxB); cout << "b" << endl; this_thread::sleep_for(chrono::milliseconds(100)); lock_guard<mutex> guard2(mtxA);*/ sB.wait(); sem.wait(); cout << "b" << endl; this_thread::sleep_for(chrono::milliseconds(100)); sem.post(); sA.post(); } } //2.生产者消费者模型 class Queue { public: Queue() { } void put(int val) { //lock_guard<mutex> guard(mtx); unique_lock<mutex> lcx(mtx); if (!_qq.empty()) { cv.wait(lcx); } _qq.push(val); cv.notify_all(); cout << "生产者生产物品" << val << endl; } void pop() { //lock_guard<mutex> guard(mtx); unique_lock<mutex> lcx(mtx); if (_qq.empty()) { cv.wait(lcx); } cout << "消费者消费物品" << _qq.front() << endl; _qq.pop(); cv.notify_all(); } private: queue<int> _qq; mutex mtx; condition_variable cv; }; void producer(Queue* q) { while (1) { q->put(1); Sleep(100); } } void consumer(Queue* q) { while (1) { q->pop(); Sleep(100); } } int main() { Queue q; thread t1(producer, &q); thread t2(consumer, &q); t1.join(); t2.join(); }
这篇关于【c++】mutex condition_variable 自定义信号量的应用和使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享