多線(xiàn)程編程中 開(kāi)優(yōu)化選項(xiàng)時(shí)要謹(jǐn)慎否則容易掉坑里
先看下面的代碼,開(kāi)起兩個(gè)線(xiàn)程,第二個(gè)線(xiàn)程把第一個(gè)線(xiàn)程的循環(huán)條件置成false 按邏輯來(lái)說(shuō)這個(gè)應(yīng)該能順利結(jié)束的不過(guò)如果用
g++ -O3 -o multiThread multiThread.cpp -lpthread
編譯的話(huà)TestThread1是退不出來(lái)的,只有 g_brun 加上 volatile關(guān)鍵字才能正常退出
因?yàn)樵?O3優(yōu)化選項(xiàng)下 執(zhí)行TestThread1時(shí)g_brun會(huì)先讀到寄存器中,編譯器發(fā)現(xiàn)這個(gè)函數(shù)中g(shù)_brun沒(méi)有任何改變所以不會(huì)再去內(nèi)存中取值直接用寄存器中的備份,在TestThread2中改變了g_brun在內(nèi)存中的值,對(duì)TestThread1中g(shù)_brun的寄存器備份沒(méi)有任何影響。
加上volatile表示對(duì)該變量不優(yōu)化每次都去內(nèi)存中取值。
創(chuàng)新互聯(lián)公司于2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元玉龍做網(wǎng)站,已為上家服務(wù),為玉龍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792
#include <pthread.h>
#include <iostream>
#include <unistd.h>
using namespace std;
//volatile bool g_brun = true;
bool g_brun = true;
void* TestThread1(void* arg)
{
cout << "TestThread1 進(jìn)入" << endl;
long long ll = 0;
while(g_brun)
ll ++;
cout << "TestThread1 退出 ll:" << ll << endl;
}
void* TestThread2(void* arg)
{
cout << "TestThread2 進(jìn)入" << endl;
g_brun = false;
cout << "TestThread2 退出 設(shè)置 g_brun = false" << endl;
}
int main()
{
pthread_t threadId1;
pthread_create(&threadId1, NULL, TestThread1, NULL);
usleep(1000000); // 保證TestThread1先執(zhí)行
pthread_t threadId2;
pthread_create(&threadId2, NULL, TestThread2, NULL);
pthread_join(threadId1,NULL);
pthread_join(threadId2,NULL);
return 0;
}
網(wǎng)站標(biāo)題:多線(xiàn)程的坑--volatile
當(dāng)前地址:http://muchs.cn/article32/gddcpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、虛擬主機(jī)、用戶(hù)體驗(yàn)、靜態(tài)網(wǎng)站、微信公眾號(hào)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)