我需要检查我创建的boost :: thread是否正在从另一个线程运行。 This SO帖子解释说你可以通过致电:
来做到这一点boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);
我的客户端线程中没有任何关键部分。我可以保证带有0时间参数的timed_join()
可以锁定吗?
答案 0 :(得分:1)
不,没有这样的保证 即使boost实现完全无锁(我还没有检查过),也无法保证底层操作系统实现完全无锁。
那就是说,如果在这里使用了锁,我会发现它们不太可能导致应用程序出现任何重大延迟,所以我会毫不犹豫地使用timed_join
,除非有一个很难的实时截止日期(不等同于UI响应)。
答案 1 :(得分:1)
Boost.Thread不保证无锁timed_join()
。但是,实施总是会发生变化:
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的替代方法。