【发布时间】:2013-04-23 01:43:12
【问题描述】:
我正在尝试解决以下问题,我知道有多种解决方案,但我正在寻找最优雅的方法(更少的代码)来解决它。
我有 4 个线程,其中 3 个尝试在无限循环中将唯一值(0、1 或 2)写入 volatile 整数变量,第四个线程尝试读取该变量的值并打印标准输出的值也在无限循环中。
我想在线程之间进行同步,以便运行写入 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? -
对于您希望的订购要求,您应该使用 c++11 std::condition_variable 和 std::mutex。
-
原子本身没有帮助,您需要一些东西来阻止线程 0 并等待线程 3 处理完数据。这需要某种互锁模式。
-
如果想让三个“线程”中的代码串行运行,则不需要线程。只需编写函数并调用它们。
-
您的问题是“移交”之一 - 将其称为生产者/消费者类型的工作负载,您要确保“消费者”(执行“打印”的线程)和“生产者”(执行“inc”的线程[s] 以交错的方式工作。您需要(实现)这里的排队机制或状态机。对于这种“锁步”实现(生产者/消费者之间的严格交替),拥有两个以上的线程是没有意义的。你确定你的问题描述在这个意义上是“准确的”,而“乒乓球”真的是你想要的吗?
标签: c++ multithreading synchronization mutex readerwriterlock