有趣的是,这似乎是一个基本问题,但我找不到任何适用于 C 语言的示例(在 SO 中,我只找到适用于 Python、C# 和 C++ 的示例)。
重点是:作为一个Qt程序员,当我需要让一些数据在不同线程之间传输时,我在then之间启动一个信号槽连接,使用emit signal
机制来做工作。
但现在我在嵌入式 Linux 的 C 应用程序中工作,我需要做类似的工作,但我没有可用的 Qt 机制。问题是:如何让两个或多个线程在 C 中以类似于 Qt 中信号和槽的方式相互通信?
我知道共享数据的方法之一是使用具有互斥锁保护更改的全局变量。但即便如此,我也可能无法以异步方式执行该系统:我将不得不有一个循环来不断检查变量是否已更改。但是,如果我想在另一个线程完成一些工作后立即执行一个线程的特定方法(因此,以异步方式)怎么办?那么这样的方式似乎失败了。
注意:虽然我使用的是嵌入式 Linux,因此,提及一些采用 POSIX 函数和其他“Linux 相关方式”的选项会有所帮助,但如果能有更多时间来讨论,对社区来说仍然会更好不严格基于某一特定平台的解决方案(如果可能的话)。
最佳答案
好好读书tutorial on pthreads .您想了解更多关于 condition variables 的信息与 mutexes 一起使用.
条件变量和互斥量应该足以满足您的需求。
您也可以使用最传统的 inter-process communication线程之间的机制,例如一个pipe(7) (可能与 poll(2) ...)。所以读Advanced Linux Programming和学习syscalls(2)和 pthreads(7)
避免使用 signal(7) -s 在线程之间并注意 signal-safety(7) .见signalfd(2) , eventfd(2) , userfaultfd(2) (你可能会使用它 cleverly handle SIGSEGV
)并从 Calling Qt functions from Unix signal handler 建议的方法中汲取灵感.
观察正在运行的多线程 Linux process与 strace(1) , ltrace(1) , gdb(1) .你会明白有几个 pthreads(7)基元正在使用 futex(7) .
两者都是GNU glibc和 musl-libc是open source并实现 pthreads 规范(并且 Glib 、 GTK 、 Qt 或 POCO 构建在它们之上)。 我邀请你研究他们的源代码。
关于C:如何让线程相互通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25876805/