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

时间:2014-09-16 19:21:59

标签: c linux multithreading pthreads

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

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

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

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

注意:虽然我使用嵌入式Linux,因此提到了一些选项,这些选项将采用POSIX功能和其他与Linux相关的方式"如果有更多时间用于不完全基于特定平台的解决方案(如果可能的话),对社区来说仍然会更好。

4 个答案:

答案 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)

生产者线程和消费者线程应该捕获彼此的tid。生产者在生产时可以发送:         pthread_kill(consumerID,SIGUSR1); 消费者使用SIGUSR1的信号处理程序进行设置,并且可以从pthread_setspecific()保存的公共std :: queue中检索产生的结果。 生产者和消费者可以继续执行其任务,而不会受到信号量或cond var / mutex的锁定。