I need to check if my boost::thread I’ve created is running from another thread. This SO post explains you can do this by calling:
boost::posix_time::seconds waitTime(0);
myBoostThread.timed_join(waitTime);
I can’t have any critical sections in my client thread. Can I guarantee that timed_join() with 0 time argument be lock free?
Boost.Thread provides no guarantees about a lock-free
timed_join(). However, the implementation, which is always subject to change:WaitForMultipleObjectsfor windows. Its documentation indicates that it will always return immediately. However, I do not know if the underlying OS implementation is lock-free.For an alternative, consider using atomic operations. While Boost 1.52 does not currently provide a public atomic library, both Boost.Smart_Ptr and Boost.Interprocess have atomic integers within their detail namespace. However, neither of these guarantee lock-free implementations, and one of the configurations for Boost.Smart_Ptr will lock with
pthread mutex. Thus, you may need to consult your compiler and system’s documentation to identify a lock-free implementation.Nevertheless, here is a small example using
boost::detail::atomic_count:In this case, the
at_thread_exit()extension could be used as an alternative to using RAII.