5

我正在用 C 语言用 pthread 编程。我希望一个线程告诉其他线程它已将消息放入消息队列中,以便其他线程知道他们可以从消息队列中获取消息。但是,发送信号的线程应该向其他线程提供更多信息,例如线程 id、消息标签等。怎么做 ?

我知道 pthread_kill 函数,但似乎需要的信息很少。当我使用线程向其他线程发送信号时,我可以获取更多信息吗?

4

2 回答 2

6

C 意义上的信号不能获取“更多信息” - 如果您想发送更多信息,那么您需要将其作为消息的一部分包含在 message_queue 中,而不是作为信号的一部分。

我很确定有几十种选择。只是你没有想到他们。就像我说的,如果你想使用信号,那么使用信号来指示有消息(如电话响铃),然后使用消息队列来传达实际信息(正在通话)。我们不使用电话铃声信号通过电话传达信息,对吧?

但我担心你在某种程度上误解了线程和信号的使用。我很确定您应该解决您正在做的任何事情的方式不是正确的方式。

由于您的问题是“我如何在信号中发送多个整数,我认为您应该接受 Arno 的回答,如果没有帮助,请再试一次 - 并描述您的总体问题是您试图解决的问题解决 - 现在您正在与机械师讨论如何丢失螺栓,但您真正需要做的是修复爆胎,因此您可能过于专注于如何解决细节,而无法混淆您没有的事实甚至连千斤顶都没有把车抬离地面……

于 2012-12-29T15:20:01.883 回答
4

一个进程的线程共享相同的地址空间。因此,为线程间通信构建一个互斥保护消息队列是很常见的。请参阅此答案以了解详细信息。消息队列可以是定制设计,例如链表结构,它可以包含元素,如sender ThreadIDreceiver ThreadIDthe message和可选的任意数量的additional parameters类似消息状态或其他内容。它还可能包含一个unique message ID和一个参数来告诉接收线程如何继续,例如是否从队列中删除消息。仍然可以使用信号来避免轮询消息队列以获取新消息。信号将触发线程读取受互斥体保护的消息队列以获取新消息。另一种方法是建立一个事件方案,如中所述这个答案。但这实际上也是一个受互斥体保护的全局标识符,它被设置并且等待线程正在轮询更改(所谓的忙等待)。可以立即对受互斥体保护的消息队列进行忙碌等待。有关更多信息,请参阅此链接pthread_cond_wait

于 2012-12-29T17:26:17.313 回答