【问题标题】:Boost Thread Check Whether Current Thread's Is Equal To Another Native HandleBoost 线程检查当前线程是否等于另一个本机句柄
【发布时间】:2013-09-02 17:11:39
【问题描述】:

我知道标题听起来很奇怪,所以让我解释一下。我有一个变量bob,它是一个boost::thread::native_handle_type,并分配了一个本机句柄。现在我想检查当前运行的进程是否与分配给 bob 的进程相同。我不负责程序的设计,所以不幸的是,检查这种比较的情况是不可避免的,因为这是一个相当大的项目。

无论如何,所以我正在寻找这样的东西:

boost::this_thread::native_handle() == bob
boost::this_thread::get_id() == bob.get_id()

这有可能吗?非常感谢!

【问题讨论】:

    标签: c++ multithreading boost boost-thread


    【解决方案1】:

    不完全是。您无法获取当前正在运行的线程的本机句柄,并且 Boost.Thread 不允许您根据本机句柄获取 ID。

    要么以某种方式更改bob,使其具有可用的thread::id,要么回退到本机代码。

    【讨论】:

    • 这总结了我的担忧。感谢您的回答!
    【解决方案2】:

    两者是等价的,但 == 和 != 运算符被标记为“向后兼容”,这意味着您不应使用它们

    // backwards compatibility
    bool operator==(const thread& other) const;
    bool operator!=(const thread& other) const;
    

    这些操作符的实现说明他们使用ID进行比较:

    inline bool thread::operator==(const thread& other) const
    {
        return get_id()==other.get_id();
    }
    
    inline bool thread::operator!=(const thread& other) const
    {
        return get_id()!=other.get_id();
    }
    

    【讨论】:

      【解决方案3】:

      是的,这是可能的。 虽然我认为你在这里误解了:

      现在我想检查当前运行的进程是否与分配给 bob 的进程相同

      比较线程ID。

      在 Windows 上使用本机句柄:GetThreadId 在 mac 和 posix 上,我认为你有一个 pthread_t * 作为句柄。此类型是线程的 id。您可以将其与pthraed_equal 进行比较,我认为请参阅here

      所以你的回答是将本机 id 类型与平台相关代码进行比较。

      如果事实上主要问题是两个平台上的原生 id 类型不同。

      【讨论】:

      • 如何从本机句柄获取 thread_id?我只有原生句柄bob,所以关键部分是bob.get_id()
      • 我担心这是唯一的选择。 ;) 当然,我正在寻找一个跨平台的实现,因为我现在的工作是尽可能多地摆脱与平台相关的位。谢谢你的帮助! (我希望我能找到另一种方法;))
      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 2012-07-09
      • 2016-05-08
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多