c++ - 告诉 std::thread 在满足条件时终止/停止自身

标签 c++ multithreading c++11 stdthread

假设我有一个工作线程tWorker,它在构造Boss 时被初始化并告诉它执行work(),直到bRetired 为真。 std::mutexmtx,锁定一些数据(vFiles),以便 tWorker 在他工作时拥有它在上面。

一旦 bRetired 变为 true,我如何让 tWorker “自杀”?当线程停止执行时,mutex 将如何销毁?

我读到std::thread 对象不能以任何方式被中断。让线程什么也不做(或调用 std::this_thread::yield())是否提供与终止线程相同的效果?

class Boss {
private:
    std::thread tWorker;
    std::mutex mtx;
    bool bRetired;
    std::vector< std::string > vFiles;

    void work() {
        while ( bRetired == false ) {
            // Do your job!
            mtx.lock();
            // ... Do something about vFiles ...
            mtx.unlock();
        }

        // tWorker has retired, commit suicide
        // ** How? **

        // Does this suffice if I want to "kill" the thread?
        std::this_thread::yield(); 
    }

public:
    Boss() {
        bRetired = false;
        tWorker = std::thread( &Boss::work, this );

        // Have worker do its job independently
        // **Bonus Question** : Should this be tWorker.join() or tWorker.detach()?
        tWorker.detach();
    }

    retire() {
        bRetired = true;
    }
}

注意事项

  • 工作线程一旦退出就不能再启动。
  • 工作线程在后台工作,不会中断主线程的执行。

最佳答案

How do I make tWorker "commit suicide" once bRetired becomes true?

您让控制流退出线程函数。那std::this_thread::yield()不必要的调用。

How would the mutex be destroyed when the thread stops execution?

那个互斥锁是Boss的成员类(class)。它在 Boss 的析构函数中被销毁当对象被销毁时。

I've read that std::thread objects cannot be interrupted in any way.

C++ API 不提供终止任意线程的方法。必须有一种方法来告诉线程终止,然后等待它终止,正如您打算做的那样。

Does letting the thread do nothing (or calling std::this_thread::yield()) provide the same effect as killing the thread?

没有。

bRetired 上存在竞争条件虽然可变。它要么需要是 std::atomic<bool>或者只有当该互斥锁被锁定时才应该读取和修改它。

关于c++ - 告诉 std::thread 在满足条件时终止/停止自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18868114/

相关文章:

c++ - 移动结构数组 C++

c++ - 您如何在单例和未命名类之间进行选择?

java - Java 中的多线程编程——方法上的差异?

c++ - enable_shared_from_this 需要什么?

c++ - 如何使用不同线程访问单例类成员函数?

c++ - 查找有符号整数和无符号整数是偶数还是奇数

c++ dynamic_cast 装饰器实例化失败

c++ - 这是否违反了严格的别名或指针对齐规则?

python - Python多久切换一次线程?

java - 我能否确定给定线程是否已由该线程或该线程的后代启动?