boost :: thread :: timed_join(0)获取锁吗?

时间:2013-01-25 12:39:54

标签: c++ boost boost-thread

我需要检查我创建的boost :: thread是否正在从另一个线程运行。 This SO帖子解释说你可以通过致电:

来做到这一点
boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);

我的客户端线程中没有任何关键部分。我可以保证带有0时间参数的timed_join()可以锁定吗?

2 个答案:

答案 0 :(得分:1)

不,没有这样的保证 即使boost实现完全无锁(我还没有检查过),也无法保证底层操作系统实现完全无锁。

那就是说,如果在这里使用了锁,我会发现它们不太可能导致应用程序出现任何重大延迟,所以我会毫不犹豫地使用timed_join,除非有一个很难的实时截止日期(等同于UI响应)。

答案 1 :(得分:1)

Boost.Thread不保证无锁timed_join()。但是,实施总是会发生变化:

  • Boost.Thread获取pthreads的互斥锁,然后对条件变量执行定时等待。
  • Boost.Thread为Windows调用WaitForMultipleObjects。它的文档表明它将立即返回。但是,我不知道底层操作系统实现是否无锁。

作为替代方案,请考虑使用原子操作。虽然Boost 1.52目前不提供公共原子库,但Boost.Smart_Ptr和Boost.Interprocess在其详细命名空间中都有原子整数。但是,这些都不能保证无锁实现,并且Boost.Smart_Ptr的其中一个配置将锁定pthread mutex。因此,您可能需要查阅编译器和系统的文档以确定无锁实现。

尽管如此,这是一个使用boost::detail::atomic_count的小例子:

#include <boost/chrono.pp>
#include <boost/detail/atomic_count.hpp>
#include <boost/thread.hpp>

// Use RAII to perform cleanup.
struct count_guard
{
  count_guard(boost::detail::atomic_count& count) : count_(count) {}
  ~count_guard() { --count_; }
  boost::detail::atomic_count& count_;
};

void thread_main(boost::detail::atomic_count& count)
{
  // Place the guard on the stack. When the thread exits through either normal
  // means or the stack unwinding from an exception, the atomic count will be
  // decremented.
  count_guard decrement_on_exit(count);
  boost::this_thread::sleep_for(boost::chrono::seconds(5));
}

int main()
{
  boost::detail::atomic_count count(1);
  boost::thread t(thread_main, boost::ref(count));

  // Check the count to determine if the thread has exited.
  while (0 != count)
  {
    std::cout << "Sleeping for 2 seconds." << std::endl;
    boost::this_thread::sleep_for(boost::chrono::seconds(2));
  }
}

在这种情况下,可以使用at_thread_exit()扩展名作为使用RAII的替代方法。