C:如何让线程相互通信?

Mom*_*gil 4 c linux multithreading pthreads

有趣的是,这似乎是一个基本问题,但我找不到任何C语言的例子(在SO中,我发现只有Python,C#和C++).

关键是:作为一个Qt程序员,当我需要在不同的线程之间传输一些数据时,我会在那之间启动信号槽连接并使用该emit signal机制来完成工作.

但现在我在嵌入式Linux的C应用程序中工作,我需要做类似的工作,但我没有Qt的机制可用.问题是:我怎样才能使两个或多个线程在C中以类似于Qt信号和插槽的方式相互通信

我知道共享数据的方法之一是全局变量,其变量受互斥锁保护.但即便如此,我可能无法以异步方式执行系统:我必须有一个循环,不断检查变量是否已更改.但是,如果我想在另一个完成一些工作之后执行某个线程的特定方法(因此,以异步方式),该怎么办?然后它似乎失败了.

注意:虽然我使用的是嵌入式Linux,因此,提及一些可以采用POSIX功能和其他"Linux相关方式"的选项会有所帮助,如果有更多的时间用于解决方案,对社区来说仍然会更好.不严格基于某个特定平台(如果可能的话).

Bas*_*tch 8

阅读有关pthreads的好教程.您想要了解有关与互斥锁一起使用的条件变量的更多信息.

条件变量和互斥量应该足以满足您的需求.

您还可以在线程之间使用大多数传统的进程间通信机制,例如管道(7)(可能与poll(2) ...).所以阅读高级Linux编程和学习系统调用(2)pthreads(7)

避免在线程之间使用signal(7) -s.

  • 由于发布的链接已损坏:https://hpc-tutorials.llnl.gov/posix/ (2认同)

Max*_*kin 5

一种方法是通过异步队列在线程之间使用消息传递。这样您就可以避免在线程之间使用共享数据,并且只有队列需要是线程安全的。

异步队列可以使用不同的同步原语来实现:

  • 管道或插座。
  • 使用互斥锁和条件变量保护的队列。
  • 非阻塞或无锁队列。