C 强制线程之间的通信

C 强制线程之间的通信,c,network-programming,pthreads,C,Network Programming,Pthreads,我是pthreads的新手,我希望有人能帮我解决一个问题。假设您有一个线程集合,所有线程都被传递相同的函数,如下所示: void *func(void *args) { ... while(...) { ... switch(...) { case one: do stuff; break; case two:

我是pthreads的新手,我希望有人能帮我解决一个问题。假设您有一个线程集合,所有线程都被传递相同的函数,如下所示:

void *func(void *args) {
    ...
    while(...) {
        ...
        switch(...) 
        {
            case one:
                do stuff;
                break;
            case two:
                do other stuff;
                break;
            case three:
                do more stuff;
                break;
        }
        ....
    }
}
在我的情况下,如果“case one”由任何线程触发,我需要所有线程退出开关并返回while循环的开始。也就是说,没有一个线程在等待某个条件。如果在每个线程运行while循环时只触发“case2”和“casetree”,那么线程将继续独立运行,而不会相互干扰

由于上述内容过于模糊,我可能需要添加一些上下文。我在一个游戏服务器上工作,它通过线程处理多个客户端。上面的功能对应于游戏代码,案例是玩家可以做出的各种动作。游戏有一个全局和一个局部组件——第一种情况对应于全局组件。如果任何玩家选择案例(移动)一,它会影响所有玩家的游戏板。在while循环的开始和切换之间是一段代码,它可以直观地为玩家更新游戏板。在双人游戏中,如果一名玩家选择移动一,第二名玩家将无法看到该移动,直到他/她移动,这将影响游戏性。我需要董事会的全局部分进行动态更新


无论如何,如果这个问题很琐碎,我很抱歉,但是在互联网上进行的一些初步搜索并没有产生任何有价值的结果。可能只是我需要更改代码的整个结构,但我还是坚持这样做,因为它非常接近工作状态。

您需要有一个原子变量作为开关盒的计数器。 原子变量保证以原子方式执行数学操作,这是多线程环境所需要的

在主/调度程序线程中的1处初始化原子变量,并通过Args传递它或使其成为全局变量。 Atmic变量是

volatile LONG counter = 1;
供windows使用。返回值是上一个值

每个线程执行以下操作:

LONG val = InterlockedAdd(&counter, 1);
switch(val)
...
对于GCC:

LONG val = __sync_fetch_and_add(&counter, 1);
switch(val)
...

我还建议您先了解一下标准的任务同步方案? 你可能会有一个想法,如何改变你的程序结构,使之更加灵活

任务同步基础:(二进制信号量、互斥)

(如果您对更详细的进程间通信(IPC)感兴趣,如消息传递、队列等,请询问!)

此外,我建议阅读状态机的实现,这有助于使您的播放器代码更加灵活! 有点复杂(我知道更简单的资源只有德语-也许母语人士可以提供帮助):

如果你想坚持你所拥有的,一个全局变量,它可以被任何其他任务更改和读取


您好,Florian

我可以建议您阅读一些关于线程编程的更多技术知识吗?特别是关于线程同步和通过互斥和/或条件变量进行通信。例如:玩家线程是否花费很长时间做
其他事情
更多事情
,您希望他们在做这些事情时被打断,还是线程主要等待玩家移动,您希望中断这种等待(您使用什么功能在那里等待)?