我用C语言编写pthread。我想要一个线程告诉其他线程它已在消息队列上放置了一条消息,以便其他线程知道它们可以从消息队列中获取消息。但是,发送信号的线程应该向其他线程提供更多信息,例如线程ID,消息标记等。怎么做 ?
我知道pthread_kill功能,但似乎需要很少的信息。当我向其他线程使用线程发送信号时,我可以获取更多信息吗?
答案 0 :(得分:6)
C语义中的信号无法获取“更多信息” - 如果要发送更多信息,则需要将其作为消息的一部分包含在message_queue中,而不是作为信号的一部分。
我很确定有很多替代方案。只是你没有想到它们。就像我说的,如果你想使用信号,那么使用一个信号来表明有信息(比如电话铃声)然后使用信息队列来传达实际信息(通过电话交谈)。我们不使用电话铃声信号通过电话传送信息,对吧?
但我担心你在某种程度上误解了线程和信号的使用。我很确定你支持解决你做的事情的方式不是正确的方法。
由于您的问题是“如何在信号中发送超过整数,我认为您应该接受Arno的答案,然后再试一次,如果这没有帮助 - 描述您的总体问题是什么正在努力解决 - 现在你正在和机械师讨论如何松开螺栓,但你真正需要做的是修复一个穿孔,所以你可能过于专注于如何解决细节问题,以及你甚至没有一个千斤顶把车从地上抬起......
答案 1 :(得分:4)
进程的线程共享相同的地址空间。因此,为通过线程的通信构建互斥保护的消息队列是很常见的。请参阅this answer以了解详细信息。消息队列可以是自定义设计,例如链接列表结构,可能包含sender ThreadID
,receiver ThreadID
,the message
等元素,以及可选的任意数量的additional parameters
消息状态等。它还可以包含unique message ID
和一个参数,以告知接收线程如何继续,例如从队列中删除消息。
仍然可以使用信号来避免轮询消息队列以获取新消息。信号将触发线程以读取受互斥保护的消息队列以获取新消息。另一种方法是建立一个事件方案,如this answer中所述。但实际上这也是一个受互斥保护的全局标识符,它被设置并且等待线程正在轮询更改(所谓的忙等待)。可以立即在互斥保护的消息队列上进行忙等待。有关pthread_cond_wait
。