为了账号安全,请及时绑定邮箱和手机立即绑定

如下程序中,请帮忙更正一下,非常感谢!

如下程序中,请帮忙更正一下,非常感谢!

C++
慕勒3428872 2023-03-03 14:10:51
// 在以下简单的程序中,运行结果应该是20000000,然而在GCC编译运行后输出的数介于一千万到两千万之间,而且每次运行的结果都不同,这是为什么呢(┬_┬)#include <iostream>#include <thread>int count=0;void test(){for(int i=0;i<10000000;i++)count++;}int main(){thread t1(test), t2(test);t1.join();t2.join();std::cout<<count<<std::endl;return 0;}
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

线程对象在声明之后就会立即执行。


thread t1(test), t2(test);//这里两个线程同时启动了,而你的线程函数没加锁

方法一:


//主函数应该这样写int main(){    thread t1(test);    t1.join();      thread t2(test);    t2.join();       std::cout<<count<<std::endl;       return 0;}

方法二:


//给线程函数加上锁#include <iostream>#include <thread>#include <mutex>  using namespace std;   int count=0;mutex gMutex;   void test(){    lock_guard<mutex> lk (gMutex);    for(int i=0;i<10000000;i++)           count++;   }   int main(){    thread t1(test), t2(test);    t1.join();       t2.join();       std::cout<<count<<std::endl;       return 0;   }

 


查看完整回答
反对 回复 2023-03-06
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

因为count变量不是线程安全的,因此多线程并发时可能出现读脏数据。

查看完整回答
反对 回复 2023-03-06
  • 2 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信