boost :: thread线程安全吗?

时间:2012-02-15 11:45:00

标签: c++ multithreading boost thread-safety boost-thread

是boost :: thread对象的线程安全吗?我应该锁定对boost :: thread(例如join)的成员方法的调用是否是线程安全的?

编辑1:请不要理会我的目的。你能回答一下这个问题吗?

编辑2(对编辑1不满意的人): 我的目的是: 考虑一个过程作为线程的程序,一个程序停止该线程。线程程序是一个while循环检查条件是否继续。停止过程将条件设置为FALSE并等待线程结束(加入),然后执行一些其他操作。关键是停止过程可以调用多个线程。

但我的问题是一般的,考虑下一个十亿个线程同时调用一个线程对象的成员方法,如get_id(),native_handle()等。

2 个答案:

答案 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 不是线程安全。