我对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循环的开始和开关之间是可视地更新玩家的游戏板的代码。在双人游戏中,如果一个玩家选择移动游戏,则第二个玩家在他/她移动之前将无法看到此移动,这会影响游戏玩法。我需要电路板的全局部分来动态更新。
无论如何,如果这个问题很简单,我会道歉,但在互联网上进行一些初步搜索并没有产生任何有价值的信息。可能只是我需要改变代码的整个结构,但我有点紧紧抓住它,因为它非常接近于工作。
答案 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)更感兴趣,比如消息传递,队列,......请问!)
此外,我建议阅读有关状态机的实现,这有助于使您的播放器代码更灵活! 有点复杂(我只用德语知道更简单的资源 - 也许是母语人士可以提供帮助):
如果你想坚持自己拥有的东西,可以改变一个全局变量&任何其他任务都可以阅读。
问候,弗洛里安