Threadfunc中使用互斥的控制台输出错误

Wrong console output in Threadfunc using mutex

本文关键字:控制台 输出 错误 Threadfunc      更新时间:2023-10-16

我第一次尝试使用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;
    }
    ...
}