首页IT科技多线程互斥锁与不带缓冲Io操作的编程(线程间互斥-mutex互斥锁和lock_guard)

多线程互斥锁与不带缓冲Io操作的编程(线程间互斥-mutex互斥锁和lock_guard)

时间2025-05-02 03:05:23分类IT科技浏览3369
导读:多线程程序 竞态条件:多线程程序执行的结果是一致的,不会随着CPU对线程不同的调用顺序而产生不同的运行结果....

多线程程序

竞态条件:多线程程序执行的结果是一致的,不会随着CPU对线程不同的调用顺序而产生不同的运行结果.

线程间互斥-mutex互斥锁和lock_guard

解决?:互斥锁 mutex

经典的卖票问题,三个线程卖100张票

代码1

#include <iostream> #include <thread> #include <list> #include <mutex> int ticketCount = 100; std::mutex mtx;//互斥锁 void sellTicket(int window) { while (ticketCount > 0) { mtx.lock(); std::cout << "窗口" << window << "销售" << ticketCount << std::endl; ticketCount--; mtx.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } }//end int main() { std::list<std::thread> tlist; for (int i = 0; i < 3; i++) { tlist.push_back(std::thread(sellTicket,i)); } for (std::thread & t : tlist) { t.join(); } system("pause"); return 0; }

上面代码的问题...

while (ticketCount > 0) { mtx.lock(); std::cout << "窗口" << window << "销售" << ticketCount << std::endl; ticketCount--; mtx.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } 如果ticketCount =1            ,当前有一个线程A while (ticketCount > 0)为true,线程A还没执行ticketCount--完成时,cpu交给了线程B 线程B while (ticketCount > 0)也为true,进入 循环体内,造成了买0号票,改进如下

代码2

#include <iostream> #include <thread> #include <list> #include <mutex> int ticketCount = 100; std::mutex mtx;//互斥锁 void sellTicket(int window) { while (ticketCount > 0) { mtx.lock(); if(ticketCount >0){ std::cout << "窗口" << window << "销售" << ticketCount << std::endl; ticketCount--; } mtx.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } }//end int main() { std::list<std::thread> tlist; for (int i = 0; i < 3; i++) { tlist.push_back(std::thread(sellTicket,i)); } for (std::thread & t : tlist) { t.join(); } system("pause"); return 0; }

代码2还有些问题!! 如下

mtx.lock(); 代码 代码 代码 代码 ..... mtx.unlock(); 如果在代码lock()和unlock()之间 非常返回,导致mtx没有正常unlock(),那么出现死锁问题 =》智能指针 lock_gurad unique_lock

看lock_gurad

线程间互斥-mutex互斥锁和lock_guard

#include <iostream> #include <thread> #include <list> #include <mutex> int ticketCount = 100; std::mutex mtx;//互斥锁 void sellTicket(int window) { while (ticketCount > 0) { { std::lock_guard<std::mutex> lock(mtx); std::cout << "窗口" << window << "销售" << ticketCount << std::endl; ticketCount--; std::this_thread::sleep_for(std::chrono::milliseconds(50)); } } }//end int main() { std::list<std::thread> tlist; for (int i = 0; i < 3; i++) { tlist.push_back(std::thread(sellTicket,i)); } for (std::thread & t : tlist) { t.join(); } system("pause"); return 0; }

线程间互斥-mutex互斥锁和lock_guard

上面的图片中我们知道lock_gurad 的拷贝构造函数被关闭了,所以当我们遇到函数调用需要拷贝构造lock_guard的时候,就有障碍了                 ,这个时候可以用unique_lock

unique_lock 转移指针,支持带右值得拷贝赋值,支持参数传递拷贝构造的,他的左值的拷贝构造也是被关闭了 看下图

线程间互斥-mutex互斥锁和lock_guard

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
phpcms v9用户手册(PHPCMS 如何注册管理员?) 网创是啥(网络上的网创是什么意思-网创类游戏的还有未来吗)