有趣的是,这似乎是一个基本问题,但我无法找到C语言的任何示例(在SO中,我只发现了Python,C#和C ++)。
关键是:作为Qt程序员,当我需要在不同线程之间传输一些数据时,我会在那之间启动信号槽连接,并使用emit signal
机制来完成工作。 / p>
但是现在我在嵌入式Linux的C应用程序中工作,我需要做类似的工作,但我没有Qt的机制可用。问题是:我怎样才能使两个或多个线程在C 中以类似于带有信号和插槽的Qt的方式相互通信?
我知道共享数据的方法之一是使用互斥锁保护更改的全局变量。但即便如此,我可能无法以异步方式执行系统:我必须有一个循环,不断检查变量是否已更改。但是,如果我想在另一个完成一些工作之后执行某个线程的特定方法(因此,以异步方式),该怎么办?然后它似乎失败了。
注意:虽然我使用嵌入式Linux,因此提到了一些选项,这些选项将采用POSIX功能和其他与Linux相关的方式"如果有更多时间用于不完全基于特定平台的解决方案(如果可能的话),对社区来说仍然会更好。
答案 0 :(得分:7)
阅读一篇好文章tutorial on pthreads。您想了解有关与condition variables一起使用的mutexes的更多信息。
条件变量和互斥量应该足以满足您的需求。
您还可以在线程之间使用大多数传统的inter-process communication机制,例如一个pipe(7)(可能带有poll(2) ...)。请阅读Advanced Linux Programming并学习syscalls(2)和pthreads(7)
避免在线程之间使用signal(7) - 。
答案 1 :(得分:3)
一种方法是使用异步队列在线程之间传递消息。这样就可以避免在线程之间使用共享数据,只有队列需要是线程安全的。
可以使用不同的同步原语实现异步队列:
答案 2 :(得分:1)
要通知“可用数据”之类的事件的线程可以注册一个回调函数,该函数可以由通知程序线程进行操作。您可以使用函数指针。
Ex:线程2为一个或多个事件注册回调函数。发生条件或事件时的线程1调用已注册的函数。
答案 3 :(得分:0)