【问题标题】:Is boost::thread thread-safe?boost::thread 线程安全吗?
【发布时间】:2023-03-29 06:01:01
【问题描述】:

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

编辑 1:请不要打扰我的目的。能简单回答一下吗?

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

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

【问题讨论】:

  • 我不明白你的问题的目的。在什么情况下需要从多个其他线程控制一个线程?

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


【解决方案1】:

加入一个线程只能从另一个线程(最好是启动它的线程)完成。在这种情况下,线程安全没有意义

好的,其实我已经看过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();
        }
    }
}

看来是的,它是线程安全的。

【讨论】:

  • 好的,这就是我想知道的。谢谢:-)
  • boost::thread 不是线程安全的,其基本原因是:同一 smart_ptr 实例不能被两个不同的线程安全地复制和销毁。
  • @Gaetano Mendola:我在这里谈论的是join,而不是所有boost::thread。无论如何,join 不应从与生成子线程 imo 的线程不同的线程调用。
【解决方案2】:

boost::thread 不是线程安全的。

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 2013-09-24
    • 2011-12-30
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多