我试图解决以下问题,我知道有多种解决方案,但我正在寻找解决它的最优雅的方式(更少的代码)。
我有4个线程,其中3个线程在无限循环中尝试向易失性整数变量写入唯一值(0、1或2),第四个线程尝试读取此变量的值,并在无限循环中将该值打印到stdout。
我想要同步线程,使写入0的线程先运行,然后是“print”线程,然后是写入1的线程,再次是print线程,以此类推…… 因此,最终我希望在“print”线程的输出中看到一系列的零,然后是一系列的1,然后是2,然后是0,依此类推……
这是程序代码:
我有4个线程,其中3个线程在无限循环中尝试向易失性整数变量写入唯一值(0、1或2),第四个线程尝试读取此变量的值,并在无限循环中将该值打印到stdout。
我想要同步线程,使写入0的线程先运行,然后是“print”线程,然后是写入1的线程,再次是print线程,以此类推…… 因此,最终我希望在“print”线程的输出中看到一系列的零,然后是一系列的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;
}
}
atomic
? - Walter