我正在使用全局變量實現線程間通信。是賦值運算符'='原子?
//global var
volatile bool is_true = true;
//thread 1
void thread_1()
{
while(1){
int rint = rand() % 10;
if(is_true) {
cout << "thread_1: "<< rint <<endl; //thread_1 prints some stuff
if(rint == 3)
is_true = false; //here, tells thread_2 to start printing stuff
}
}
}
//thread 2
void thread_2()
{
while(1){
int rint = rand() % 10;
if(! is_true) { //if is_true == false
cout << "thread_1: "<< rint <<endl; //thread_2 prints some stuff
if(rint == 7) //7
is_true = true; //here, tells thread_1 to start printing stuff
}
}
}
int main()
{
HANDLE t1 = CreateThread(0,0, thread_1, 0,0,0);
HANDLE t2 = CreateThread(0,0, thread_2, 0,0,0);
Sleep(9999999);
return 0;
}
問題
在上面的代碼中,我使用全局變量volatile bool is_true
切換thread_1和thread_2之間打印。
我不知道這裏是否使用賦值操作是線程安全的?
我寧願使用原子交換原語,但我不能解決你會遇到問題的場景...... –
@KerrekSB,這個場景?那麼,我只是簡單地展示了我的問題,:) – Alcott
嗯,我的意思是一系列的加載和存儲將被充分打破,使兩個線程進入關鍵部分...通常應該能夠展示這樣一個序列以說明爲什麼某些代碼不正確。雖然我在這裏看不到它。我仍然不喜歡代碼,但我無法證明爲什麼。 –