c++多线程の数据竞争和互斥对象
2024-10-18 05:33:19
看两个代码:
void function()
{ for(int i=;i>;i--)
{
cout<<"from sub thread"+i<<endl;
}
} void main()
{
thread((function()));
for(int i=;i<;i++)
{
cout<<"from main thread"+i<<endl;
} }
以上由于共用资源cout对象,而出现不规律的输出;
可以通过加入mutex对象进行加锁,需要包含头文件mutex.h
nutex mu;
void shared_printf(string fromThread,int id)
{ mu.lock();
cout<<fromThread+id<<end;
mu.unlock(); }
存在风险是cout中抛出异常将永远锁死;
这时候可以用对象:std::mutex_gard<std::mutex> gard(mu);
对象,无论cout是否成功,都将自动解锁;
具体如下:
nutex mu;
void shared_printf(string fromThread,int id)
{
std::mutex_gard<std::mutex> gard(mu);
cout<<fromThread+id<<end; } 但是以上的代码只保证了在此程序中的互斥,锁并没有完全保护住cout,存在一定的不安全性;以上问题可以通过新建立一个类,私有调用保护;
注意:线程的安全永远是相对的,根据需要控制安全级别
最新文章
- HDU 1848 SG函数博弈
- 用Kotlin开发Android应用(I):介绍
- java:同步和死锁
- Datatables带参重绘
- Linux 下没有 my.cnf 文件的解决方式,完全是我自己整的,好多教程都是瞎扯的 (zhuan)
- poj2631 树的直径 + bfs
- SAP_20140304
- [转]Install App to SD
- RedHat7配置Nginx实现多域名虚拟主机的SSL/TLS认证(实现单IP以不同证书服务于不同域名)
- b/s客户端和服务器的交互(转)
- spring MVC cors跨域实现源码解析
- PHP开发中Redis安装(CentOS6.5)
- linux服务器情况
- 让你一看就懂的快速排序算法(Java)
- <;%: Html.DisplayNameFor与 <;%: Html.DisplayFor的区别
- sprint最后冲刺-out to out
- python全栈开发day42-固定定位等
- 三:MyBatis学习总结(三)——优化MyBatis配置文件中的配置
- [label][翻译][JavaScript-Translation]七个步骤让你写出更好的JavaScript代码
- 图论-最短路径--3、SPFA算法O(kE)