2013-12-15 68 views
0

我是一个pthreads的新手,我希望有人可以帮助解决我遇到的问题。假设你有一个线程的集合,所有被传递相同的功能,这看起来是这样的:强制线程之间的通信

void *func(void *args) { 
    ... 
    while(...) { 
     ... 
     switch(...) 
     { 
      case one: 
       do stuff; 
       break; 
      case two: 
       do other stuff; 
       break; 
      case three: 
       do more stuff; 
       break; 
     } 
     .... 
    } 
} 

在我的情况下,如果“情况下,一个”由任何线程引发的,我需要所有的线程退出交换机并返回到while循环的开始。也就是说,没有任何线程等待一定的条件。如果在每个线程运行while循环时只触发“情况2”和“情况3”,则线程将继续独立运行而不会相互干扰。

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

无论如何,我很抱歉如果这个问题是微不足道的,但在互联网上的初步搜索没有产生任何有价值的东西。这可能只是因为我需要改变代码的整个结构,但我坚持这一点,因为它非常接近工作。

+1

我可以建议你阅读一些关于Thread编程的更多技术性的东西吗?特别是关于线程同步和通过互斥锁和/或条件变量的通信。例如:https://computing.llnl.gov/tutorials/pthreads/ –

+0

玩家线程是否花费很长时间来执行“其他东西”或“更多东西”,并且是否希望它们被中断?或者是线程主要是等待玩家进行移动,并且你是否想要中断这个等待(以及在那里等待什么功能)? – Armali

回答

0

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

在主/调度程序线程中初始化1的原子变量,并通过参数或将其传递给全局变量。 自性变量是

volatile LONG counter = 1; 

for Windows一起使用InterlockedAdd。返回值是以前的值。

每个线程的作用:

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

对于GCC:

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

我还建议,首先要告知自己的标准的任务同步方案? 你可能会有一个想法,如何改变你的程序结构,使其更加灵活。

任务同步基础:(二进制信号,mutex)

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?

如果你想坚持你所拥有的,一个全球性的变量,可以通过&更改任何其他任务读取。

问候,Florian