Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程从单独的线程运行和连接_C++_C++11_Thread Safety - Fatal编程技术网

C++ 线程从单独的线程运行和连接

C++ 线程从单独的线程运行和连接,c++,c++11,thread-safety,C++,C++11,Thread Safety,我有一个在线程中创建的共享\u ptr对象。在这个对象内部有一个start函数,它创建另一个线程。还有一个stop函数,它保存并连接这些内部线程。从任何单独的线程停止(调用join)安全吗 TestThreadClass.cpp namespace { std::thread T1; std::atomic_bool workerFlag(true); void workerFunc() { while (workerFlag.load())

我有一个在线程中创建的共享\u ptr对象。在这个对象内部有一个start函数,它创建另一个线程。还有一个stop函数,它保存并连接这些内部线程。从任何单独的线程停止(调用join)安全吗

TestThreadClass.cpp

namespace
{
    std::thread T1;
    std::atomic_bool workerFlag(true);
    void workerFunc()
    {
        while (workerFlag.load())
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
    }
}  //namespace

TestThreadClass::~TestThreadClass()
{
    stop();
}

void TestThreadClass::start()
{
    T1 = std::thread{workerFunc};
}
void TestThreadClass::stop()
{
    workerFlag.store(false);
    if (T1.joinable())
    {
        T1.join();
    }
}
main.cpp

namespace
{
    std::shared_ptr<TestThreadClass> mainObj;
    void workerFunc()
    {
        auto newObject = std::make_shared<TestThreadClass>();
        newObject->start();
        std::atomic_store(&mainObj, newObject);
    }

    void workerFunc2()
    {
        mainObj->stop();
    }
}  // namespace

int main(int argc, char** argv)
{
    std::thread t1{workerFunc};
    t1.join();
    t1 = std::thread{workerFunc2};
    t1.join();
    return 0;
}
名称空间
{
std::共享_ptr mainObj;
void workerFunc()
{
auto newObject=std::make_shared();
newObject->start();
std::原子存储(&mainObj,newObject);
}
void workerFunc2()
{
mainObj->stop();
}
}//名称空间
int main(int argc,字符**argv)
{
std::线程t1{workerFunc};
t1.join();
t1=std::线程{workerFunc2};
t1.join();
返回0;
}

join
等待线程停止,
join
不停止线程
mainObj
T1
的销毁顺序未指定。当
mainObj
被销毁时,它调用
~TestThreadClass()
,然后调用访问
T1
stop()
——但是
T1
可能已经被销毁,因此程序将显示未定义的行为。感谢Igor Tandetnik。你是对的。我忘了变量在不同TU之间的销毁顺序未指定。
join
等待线程停止,
join
不停止线程
mainObj
T1
的销毁顺序未指定。当
mainObj
被销毁时,它调用
~TestThreadClass()
,然后调用访问
T1
stop()
——但是
T1
可能已经被销毁,因此程序将显示未定义的行为。感谢Igor Tandetnik。你是对的。我忘了变量在不同TU之间的顺序是未指定的。