Threadfunc中使用互斥的控制台输出错误
Wrong console output in Threadfunc using mutex
我第一次尝试使用Mutex实现所谓的"天皇"游戏,在设置了Mutex部分的终止标志后,我的输出出现了问题。
如果有人想仔细查看,下面是代码:
http://fpaste.org/95304/54333139/
在设置了终止标志之后,我释放互斥锁,并从我的threadfunc返回0。但另一个重新记忆的两个线程仍然进入while循环,并产生错误的输出。为什么会这样?我该怎么改变呢?
在设置了终止之后,其他两个线程必须打印出他们输掉了比赛,但这首先表明他们赢了,然后又表明他们输了比赛。
玩家#0移除了3根棍子
并获胜
玩家#1移除了0根棍子
并获胜
玩家#2移除了0根棍子
并获胜
Drücken Sie eine相信味道。
如果我添加其他部分(!gTermination)
else if(!gTermination)
{
cout << " n and wins!!!" << endl;
gTermination=true;
ReleaseMutex(hMutex);
return 0;
}
那么输出几乎为真,因为其他两个线程仍然进入while循环:
2号球员错失了机会…-没有删除任何内容
玩家#0移除了3根棍子
并获胜
玩家#1移除了0根棍子
游戏结束-我,玩家#1输了
玩家#2移除了0根棍子
游戏结束-我,2号玩家输了
Drücken Sie eine相信味道。
那么,为什么其他两个线程仍然进入循环,尽管已经设置了终止标志?
while循环开始如下:
while(!gTermination)
{
DWORD res=WaitForSingleObject(hMutex,INFINITE);
...
}
所以每个玩家都在hMutex
上进行阻塞,然后你将标志设置为true,然后释放hMutex
,这样他们就完成了循环。一个简单的修复方法是这样的:
while(!gTermination)
{
DWORD res=WaitForSingleObject(hMutex,INFINITE);
if(gTermination)
{
ReleaseMutex(hMutex);
break;
}
...
}
相关文章:
- C++:将控制台输出存储在宏中更好吗
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 控制台输出在 Qt5 中未正确显示
- 有人可以向我解释为什么控制台输出 0 吗?
- 使用 std::string_view 的子字符串控制台输出
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 我如何阅读简单的控制台输出
- 是否可以在 RTL(从右到左)中制作控制台输出?
- 如何让控制台输出覆盖控制台而不是纯文本输出?
- 乱码控制台输出管道 stderr 到更多
- 将控制台输出写入.txt并在控制台上显示
- 当被一个输入分开时,有两个控制台输出同时显示
- VSCode C++调试捕获控制台输出
- 如何将控制台输出中的所有内容复制到文本文件?
- C++ 使用简单的代码同时写入文件和控制台输出
- 使控制台输出是否"verbose"的最快方法
- 将 ffmpeg 控制台输出重定向到C++中的字符串或文件
- C++ 控制台输出到 cmd 在重复十次后出错
- 从控制台输出读取 C++
- 如何将控制台输出的文本颜色更改为红色,但如果从Powershell或CMD运行,背景将保持相同的颜色