【问题标题】:How do I know which thread called a method我怎么知道哪个线程调用了一个方法
【发布时间】:2010-02-25 17:45:18
【问题描述】:

我有一个被多个线程调用的 threadSafe 方法。有没有办法知道哪个线程调用了它?

【问题讨论】:

  • 大多数时候,根据调用者的身份改变方法的行为是个坏主意。您要做什么,这应该根据调用者在哪个线程中运行而改变?如果需要知道这一点是合理的,那么通常有一些与要传递的问题明显相关的内容。
  • 基本上,我有函数A,它使用QUDPSocket 来写入数据报,并且readyRead 信号连接到读取数据报的插槽。当从主线程调用 functionA 时,我不希望发出信号或调用方法(我直接使用 readyread),但是当从 qthread 调用它时我会这样做。 udp 套接字在主线程中。
  • 你不能在 2 个或更多函数中破坏 functionA 吗?那么主线程只调用“必要的部分”,其他的调用完整的函数?
  • 我不发出 readyRead 信号我只调用 writeDatagram 函数,该函数最终获得从回复数据包到达所产生的事件发出的信号。因此,从 qthread 插槽将在 functionA 运行时执行,但从主线程不会执行,因为在函数返回之前不会调用插槽。这与事件循环有关

标签: c++ multithreading qt boost-thread


【解决方案1】:

好吧,您知道调用该方法的线程,并且通过扩展,同一线程将在该方法调用中处于活动状态。您可以拨打QThread::currentThread() 来获取此信息。

【讨论】:

  • 其实没有方法叫getCurrentThread,但是QThread中有一个叫currentThread的静态...我试试吧。
  • 啊,是的,抱歉——我以为原始帖子说的是 Java :) 我在 Java 中也弄错了 currentThread,实际上这里也是 Thread.currentThread(),呃 :) 无论如何,很高兴我的发布帮助;看起来这两个 API 有类似命名的类/方法:)
  • 这对我不起作用。文档说你不应该自己发出finished()。我有一个 QThread * 数组,并将它们与 QThread::currentThread() 进行比较,当调用finished() 时,但没有匹配。我认为它在调用 signal finished() 时返回 GUI 线程而不覆盖或发出它。
【解决方案2】:

如果需要,可以添加threadId参数,让它线程传递给方法

【讨论】:

  • 是的,我知道这一点,但我想尽量减少用户干预,以免任何人以错误的方式调用该函数,现在用户必须知道它是主线程还是 qthread 调用。因此,只有在 qthread 中工作时才需要添加该参数
  • 文档说这是一个内部值,你不应该使用它。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2021-12-01
  • 2015-03-06
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多