猿问

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

// 在以下简单的程序中,运行结果应该是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;

}

慕勒3428872
浏览 82回答 2
2回答

哔哔one

线程对象在声明之后就会立即执行。thread&nbsp;t1(test),&nbsp;t2(test);//这里两个线程同时启动了,而你的线程函数没加锁方法一://主函数应该这样写int&nbsp;main(){&nbsp;&nbsp;&nbsp;&nbsp;thread&nbsp;t1(test);&nbsp;&nbsp;&nbsp;&nbsp;t1.join();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread&nbsp;t2(test);&nbsp;&nbsp;&nbsp;&nbsp;t2.join();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout<<count<<std::endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}方法二://给线程函数加上锁#include&nbsp;<iostream>#include&nbsp;<thread>#include&nbsp;<mutex>&nbsp;&nbsp;using&nbsp;namespace&nbsp;std;&nbsp;&nbsp;&nbsp;int&nbsp;count=0;mutex&nbsp;gMutex;&nbsp;&nbsp;&nbsp;void&nbsp;test(){&nbsp;&nbsp;&nbsp;&nbsp;lock_guard<mutex>&nbsp;lk&nbsp;(gMutex);&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i<10000000;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;int&nbsp;main(){&nbsp;&nbsp;&nbsp;&nbsp;thread&nbsp;t1(test),&nbsp;t2(test);&nbsp;&nbsp;&nbsp;&nbsp;t1.join();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.join();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout<<count<<std::endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp;&nbsp;}&nbsp;

梦里花落0921

因为count变量不是线程安全的,因此多线程并发时可能出现读脏数据。
随时随地看视频慕课网APP
我要回答