// 在以下簡(jiǎn)單的程序中,運(yùn)行結(jié)果應(yīng)該是20000000,然而在GCC編譯運(yùn)行后輸出的數(shù)介于一千萬到兩千萬之間,而且每次運(yùn)行的結(jié)果都不同,這是為什么呢(┬_┬)#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貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
線程對(duì)象在聲明之后就會(huì)立即執(zhí)行。
thread t1(test), t2(test); //這里兩個(gè)線程同時(shí)啟動(dòng)了,而你的線程函數(shù)沒加鎖 |
方法一:
//主函數(shù)應(yīng)該這樣寫 int main() { thread t1(test); t1.join(); thread t2(test); t2.join(); std::cout<<count<<std::endl; return 0; } |
方法二:
//給線程函數(shù)加上鎖 #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; } |

夢(mèng)里花落0921
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
因?yàn)閏ount變量不是線程安全的,因此多線程并發(fā)時(shí)可能出現(xiàn)讀臟數(shù)據(jù)。
- 2 回答
- 0 關(guān)注
- 114 瀏覽
添加回答
舉報(bào)
0/150
提交
取消