如何向其他线程发送带有更多信息的信号?

5
我正在使用C语言的pthread进行编程。我想让一个线程告诉其他线程它已经将消息放入了消息队列,这样其他线程就会知道他们可以从消息队列中获取消息。然而,发送信号的线程应该向其他线程提供更多信息,比如线程ID、消息标签等等。如何做到这一点?
我知道pthread_kill函数,但它似乎只提供少量信息。当我使用一个线程向其他线程发送信号时,我能否提供更多信息?

4
开发人员的母语不是英语的同行应该更理解他们,多一些宽容。 - DOK
感谢你的考虑,DOK。 - Nick Dong
你真正的问题是“如何创建一个可等待的消息队列以在线程之间传递消息”吗?如果是,那么信号绝对不是正确的方法。 - David Schwartz
@DavidSchwartz 实际上,我不希望尝试接收消息的线程等待太长时间,即使存在可等待的消息队列。 - Nick Dong
2个回答

6
在C语言中,信号无法承载“更多信息”-如果您想发送更多信息,则需要将其作为消息的一部分包含在消息队列中,而不是作为信号的一部分。
我相信有许多替代方法。只是你还没有想到。就像我说的,如果要使用信号,则使用信号表示有消息(就像电话铃声一样),然后使用消息队列传递实际信息(打电话)。我们不能使用电话铃声信号来传达电话上的消息,对吧?
但我担心您可能对线程和信号的用法有所误解。我很确定,您本应该解决您正在做的任何事情的方法,不是正确的方法。
由于您的问题是“如何在信号中发送超过一个整数”,我认为您应该接受Arno的答案,如果那没帮助,则再试一次,并描述您要解决的整体问题-现在您正在与技术工人讨论如何松开螺栓,但您真正需要做的是修补轮胎,因此您可能过于专注于如何解决细节,而忽略了甚至没有千斤顶把车举起来。

是的,除了kill()和pthread_kill()之外,我不知道其他的方法。 - Nick Dong
由于我的回答有点长,我已经编辑了我的答案。 - Mats Petersson
1
“+1”表示“现在你正在与机械师讨论如何松开螺栓,但你真正需要做的是修补一个穿孔”,这句话非常正确。@NickDong:也许您可以详细解释一下您想要实现什么? - Arno
所以,我仍然认为您正在错误的方式解决问题,并且如我所说,请接受此处提供的两个答案之一,并重新开始提出描述您要解决的实际情况的问题。为什么线程不能等待消息?这是这些问题的典型解决方案-您有队列,您在线程中选择一个消息,处理它,发送回结果[如果适用],然后继续选择下一个消息。如果没有可用的消息,则线程休眠,直到有可用的消息。 - Mats Petersson
@NickDong:锁定互斥量并获取消息非常快。我不认为这会普遍导致饥饿问题。 - Arno
显示剩余4条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接