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

C:如何使线程相互通信?,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,有趣的是,这似乎是一个基本问题,但我找不到任何C语言的例子(在SO中,我只找到Python、C#和C++) 要点是:作为一个Qt程序员,当我需要在不同线程之间传输一些数据时,我会在线程之间启动一个信号槽连接,然后使用emit signal机制来完成这项工作 但现在我在一个嵌入式Linux的C应用程序中工作,我需要做类似的工作,但我没有可用的Qt机制。问题是:如何使两个或多个线程在C中以类似于Qt的方式通过信号和插槽进行通信 我知道共享数据的方法之一是使用受互斥锁保护的全局变量。但即使这样,我也可

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

要点是:作为一个Qt程序员,当我需要在不同线程之间传输一些数据时,我会在线程之间启动一个信号槽连接,然后使用
emit signal
机制来完成这项工作

但现在我在一个嵌入式Linux的C应用程序中工作,我需要做类似的工作,但我没有可用的Qt机制。问题是:如何使两个或多个线程在C中以类似于Qt的方式通过信号和插槽进行通信

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

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

阅读一篇好文章。你想知道更多关于使用的信息

条件变量和互斥量可能足以满足您的需要

您还可以在线程之间使用大多数传统机制,例如a(可能带有…)。因此,阅读、学习和学习

避免在线程之间使用-s,并注意。但是,请看,(您可能会使用它)并从作者建议的方法中获得灵感

观察一个正在运行的多线程Linux。您将了解有几个原语正在使用


和都是和实现pthreads规范(和或构建在它们之上)我邀请您研究它们的源代码。

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

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

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

要通知“数据可用”等事件的线程可以注册回调函数,该函数可由通知程序线程触发。您可以为此使用函数指针


例如:线程2为一个或多个事件注册回调函数。条件或事件发生时线程1调用已注册函数。

生产者线程和消费者线程应捕获彼此的tid。制作中的制作人可以发送: pthread_kill(consumerID,SIGUSR1); 消费者使用SIGUSR1的信号处理程序进行设置,可以从pthread_setspecific()保存的公共std::queue检索生成的结果。
生产者和消费者可以在不被信号量或cond var/mutex锁定的情况下继续他们的任务。

不知道
系统调用
如何适应这一点,但除此之外+1。他们总结了许多与IPC相关的事情(可以在线程之间使用):
管道
套接字
事件fd
等。。。我不想列出所有与IPC相关的
syscalls
!是的,但是对于一个高级开发人员来说,这是最有趣的。我认为对于初学者来说,让我们把重点放在基础上(比如互斥体、信号量以及如何与
pthreads
一起使用它们;如何使用它们来协调对共享数据的访问等等)。20年来,我从未见过有人使用甚至谈论过使用信号进行线程间通信?!有一些问题提到了这一点,但我不建议使用信号进行线程间通信。Python对此有抽象层。@PavelŠimerda,如果Python没有臭名昭著的……啊,是的,进程间队列在Python中更有用一些。我还看到这个问题明确排除了Python,我最初没有看到它。您的嵌入式系统的规格是什么?也许你可以使用C++ + @ MaxyGigRuSukKin,实际上我想在这个项目中使用Qt(SO C++),这样我可以使用信号和时隙之类的,但是团队的其他成员不赞成,并且喜欢继续使用纯C+TI来感受你的痛苦:(@巴西尔:原始问题是“如何在不轮询全局变量的情况下以异步方式与另一个线程共享数据“。因此,要实现这一点,您可以使用回调函数,这是许多库中的普遍做法。请用什么注册回调函数?哪个API?您必须创建自己的API来实现这一点。它只是一个函数指针。等等,它是一个API,还是仅仅是一个函数指针?这个线程如何安全?