是boost :: thread对象的线程安全吗?我应该锁定对boost :: thread(例如join)的成员方法的调用是否是线程安全的?
编辑1:请不要理会我的目的。你能回答一下这个问题吗?
编辑2(对编辑1不满意的人): 我的目的是: 考虑一个过程作为线程的程序,一个程序停止该线程。线程程序是一个while循环检查条件是否继续。停止过程将条件设置为FALSE并等待线程结束(加入),然后执行一些其他操作。关键是停止过程可以调用多个线程。
但我的问题是一般的,考虑下一个十亿个线程同时调用一个线程对象的成员方法,如get_id(),native_handle()等。
答案 0 :(得分:2)
加入一个线程只能从一个其他线程(最好是启动它的线程)完成。在这种情况下,线程安全没有意义
好的,我实际上已经查看了boost :: thread的源代码:
void thread::join()
{
detail::thread_data_ptr const local_thread_info=(get_thread_info)();
if(local_thread_info)
{
bool do_join=false;
{
unique_lock<mutex> lock(local_thread_info->data_mutex);
while(!local_thread_info->done)
{
local_thread_info->done_condition.wait(lock);
}
do_join=!local_thread_info->join_started;
if(do_join)
{
local_thread_info->join_started=true;
}
else
{
while(!local_thread_info->joined)
{
local_thread_info->done_condition.wait(lock);
}
}
}
if(do_join)
{
void* result=0;
BOOST_VERIFY(!pthread_join(local_thread_info->thread_handle,&result));
lock_guard<mutex> lock(local_thread_info->data_mutex);
local_thread_info->joined=true;
local_thread_info->done_condition.notify_all();
}
if(thread_info==local_thread_info)
{
thread_info.reset();
}
}
}
似乎是的,它是线程安全的。
答案 1 :(得分:0)
boost::thread
不是线程安全。