【问题标题】:C++11 std::thread::detach and access to shared dataC++11 std::thread::detach 和访问共享数据
【发布时间】:2013-01-03 22:38:52
【问题描述】:

如果您在std::thread 和主线程(或任何其他线程)之间有共享变量,即使您在创建线程后立即执行thread::detach() 方法,您仍然可以访问这些共享变量吗?

【问题讨论】:

    标签: c++ multithreading c++11


    【解决方案1】:

    是的!调用detach() 后,仍然可以访问全局、​​捕获和传入的变量。

    但是,如果您正在调用 detach,很可能您希望从创建线程的函数中返回,从而允许线程对象超出范围。如果是这种情况,您必须注意该函数的任何本地变量都没有通过引用或指针传递给线程。

    您可以将detach() 视为线程不需要创建线程的任何本地内容的声明。

    在以下示例中,一个线程在超出范围后继续访问起始线程堆栈上的int。这是未定义的行为!

    void start_thread()
    {
        int someInt = 5;
        std::thread t([&]() {
            while (true)
            {
                // Will print someInt (5) repeatedly until we return. Then,
                // undefined behavior!
                std::cout << someInt << std::endl;
            }
        });
    
        t.detach();
    }
    

    这里有一些可能的方法来防止地毯从你的线下被扫出:

    • 声明int 在任何需要它的线程的生命周期内都不会超出范围(可能是全局的)。
    • 将共享数据声明为std::shared_ptr 并将其按值传递到线程中。
    • 按值传递(执行复制)到线程中。
    • 将右值引用(执行移动)传递到线程中。

    【讨论】:

    • 当我通过 hellgrind 运行它时,线程之间似乎存在递增和递减 shared_ptr 的竞争条件。
    【解决方案2】:

    是的。分离线程只是意味着它在完成后会自行清理,您不再需要也不允许join它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2017-02-20
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多