【问题标题】:how to send signal with more information to other threads?如何向其他线程发送带有更多信息的信号?
【发布时间】:2012-12-29 15:08:49
【问题描述】:

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

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

【问题讨论】:

  • 人们应该对母语不是英语的开发人员多一些了解。
  • 谢谢你,DOK。
  • 您真正的问题是“如何创建一个等待消息队列以在线程之间传递消息?”如果是这样,信号肯定不是正确的方式。
  • @DavidSchwartz 实际上,我不希望尝试接收消息的线程等待很长时间,即使有一个可等待的消息队列。

标签: c multithreading pthreads signals multiprocessing


【解决方案1】:

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

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

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

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

【讨论】:

  • 我希望接收消息的线程知道消息已经到达。所以我需要将消息放入队列的线程来通知其他线程。 @Mats Petersson
  • 是的,因此您可以使用信号发送“消息队列中有消息”的消息。您不能传递比信号本身更多的信息。如果“信号”不是指 定义的常规 C 风格信号,那么我们需要更清楚地说明您的问题。
  • 是的,除了 kill() 和 pthread_kill(),我不知道任何其他方法。
  • 由于我的回复有点长,我已经编辑了我的答案。
  • +1 for “现在您正在与机械师讨论如何丢失螺栓,但您真正需要做的是修复爆胎”。这是真的。 @NickDong:也许您可以更详细地解释您要完成的工作?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多