我试着解决以下问题,我知道有多种解决方案,但我正在寻找最优雅的方式(少代码)来解决它。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