如何中断其他std :: threads c

我有一个服务器,它是以每个客户端的方式构建的.最近,我碰到了一个问题,我很难找到解决方案,所以我想问一些帮助.

我的服务器有一个大厅,大厅里有很多房间(所有房间都由用户拥有),房间里有玩家.每个房间都有一个管理员,当管理员选择离开时 – 房间关闭,所有用户都应该返回大厅.

现在,我已经有了一个工作代码 – 但问题是,我不知道我应该如何让其他客户也退出房间.线程中运行的代码如下:

while(in_lobby)
{
//Receive a message
//Do stuff
//In certain cases change the Boolean to fit to the situation
//Send a comeback
}

while(in_room)
{
//Receive a message
//Do stuff
//In certain cases change the Boolean to fit to the situation
//Send a comeback
}

while(in_game)
{
//When a game started
//Not practical right now, though
}

从一个客户端的线程到另一个客户端的线程没有问题(因为它们不是本地变量,它们是我可以通过处理管理员选择关闭房间的线程更改的几个条件).

当条件DOES改变时,问题发生,并且while循环应该在下一次迭代之前退出.它为什么会发生?因为在迭代开始时有一个recv()调用,它等待客户端的消息.

现在,条件还可以,一切正常,但循环不会继续(所以它不会到达下一次迭代 – 看到条件为假),直到服务器收到来自客户端的某个消息(它不应该,因为关闭房间不依赖于普通用户 – 用户只接收和警告,这也是通过管理员的线程发送的,关于正在关闭的房间).

因此,我的问题是:

我怎样才能表现我想要的?如何让这些用户突破循环,返回大厅(管理员这样做是没有问题的,因为他的线程就是那个完成所有事情并且他成功返回大厅的线程)而不改变整体从每个客户端线程的架构?

最佳答案

“Because in the beginning of the iteration there’s a recv() call, which awaits the client’s messages.”

可能你不希望在第一个位置有一个阻塞的recv()调用.
Windows Socket API中有select()函数,您可以使用它来观察许多套接字文件描述符的状态更改.

基本上你将有一个运行循环的线程,并轮询select()调用的返回值.不要使用紧密循环来占用CPU,应该指定合理的超时值,但是可以使用零超时,并且仅轮询可用状态.

如果返回值表示某个观察到的套接字可用某些操作(select()> 0),则可以检查观察到的套接字文件描述符(如果它们是使用

FD_ISSET(s, *set)

宏.

点赞