强制线程之间的通信

时间:2013-12-15 09:10:20

标签: c network-programming pthreads

我对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循环时只触发“case 2”和“case 3”,则线程会继续独立运行而不会相互干扰。

由于以上内容太模糊,我应该添加一些上下文。我正在开发一个通过线程处理多个客户端的游戏服务器。上述功能对应于游戏代码,案例是玩家可以进行的各种动作。游戏具有全局和本地组件 - 第一种情况对应于全局组件。如果任何一个玩家选择一个(移动)一个,它会影响所有玩家的游戏板。在while循环的开始和开关之间是可视地更新玩家的游戏板的代码。在双人游戏中,如果一个玩家选择移动游戏,则第二个玩家在他/她移动之前将无法看到此移动,这会影响游戏玩法。我需要电路板的全局部分来动态更新。

无论如何,如果这个问题很简单,我会道歉,但在互联网上进行一些初步搜索并没有产生任何有价值的信息。可能只是我需要改变代码的整个结构,但我有点紧紧抓住它,因为它非常接近于工作。

2 个答案:

答案 0 :(得分:0)

你需要有一个原子变量作为switch-case的计数器。 保证原子变量以原子方式执行数学运算,这是多线程环境所需要的。

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

是atmic变量
volatile LONG counter = 1;

对于Windows使用InterlockedAdd。返回值是先前的值。

每个帖子都有:

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

GCC:

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

答案 1 :(得分:0)

我可以建议,您首先了解标准任务同步方案吗? 您可能会有一个想法,如何更改您的程序结构以更灵活。

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

  

http://www.chibios.org/dokuwiki/doku.php?id=chibios:articles:semaphores_mutexes   (如果您对InterProcessCommuncation(IPC)更感兴趣,比如消息传递,队列,......请问!)

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

  

http://johnsantic.com/comp/state.html

     

Is there a typical state machine implementation pattern?

如果你想坚持自己拥有的东西,可以改变一个全局变量&任何其他任务都可以阅读。

问候,弗洛里安