我試着解決以下問題,我知道有多種解決方案,但我正在尋找最優雅的方式(少代碼)來解決它。C++以最優雅的方式同步線程
我有4個線程,其中3個嘗試在無限循環中向易失性整數變量寫入唯一值(0,1或2),第4個線程嘗試讀取此變量的值並打印stdout的值也在無限循環中。
我想在線程之間進行同步,以便寫入0的線程將被運行,然後是「打印」線程,然後是寫入1,然後再次打印線程的線程,如此等等... 因此,最後我期望看到在「打印」線程的輸出是一個零序列,然後序列1,然後2,然後0,依此類推...
什麼是最優雅,最簡單這些線程之間的同步方式。
這是程序代碼:
volatile int value;
int thid[4];
int main() {
HANDLE handle[4];
for (int ii=0;ii<4;ii++) {
thid[ii]=ii;
handle[ii] = (HANDLE) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadProc, &thid[ii], 0, NULL);
}
return 0;
}
void WINAPI ThreadProc(LPVOID param) {
int h=*((int*)param);
switch (h) {
case 3:
while(true) {
cout << value << endl;
}
break;
default:
while(true) {
// setting a unique value to the volatile variable
value=h;
}
break;
}
}
爲什麼不使用C++ 11和'atomic'? – Walter 2013-04-29 11:46:25
對於您希望的訂購要求,您應該使用C++ 11 std :: condition_variable和std :: mutex。 – 2013-04-29 12:02:26
原子本身沒有幫助,你需要一些東西來阻塞線程0並等待線程3處理完數據。這需要某種相互鎖定模式。 – 2013-04-29 12:04:31