启动一个守护程序线程,它是该类的私有方法?

old*_*994 4 c++ multithreading c++11

我是C++ 11线程的新手,我正在尝试做如下的事情:

class Something {
public:
    void start() {
        this->task_ = std::thread(&Something::someTask, this);
        this->isRunning_ = true;
        this->task_.detach(); // I read detach will stop it from hanging
    }

    void stop() {
        this->isRunning = false;
    }

    ~Something() {
         this->stop();
    }        

private:
    std::atomic<bool> isRunning_;
    std::thread task_;
    void someTask()
    {
        while(this->isRunning_) {
            // do something forever
        }
    }
};

Something whatever;
whatever.start();
Run Code Online (Sandbox Code Playgroud)

但是,线程不断被阻止.whatever.start()执行后没什么.它只是在循环运行时挂起.

πάν*_*ῥεῖ 6

通常的模式是

class Something {
public:
    void start() {
        this->task_ = std::thread(&Something::someTask, this);
        // this->task_.detach(); <<<<<< Don't do that.
    }

    void stop() {
        this->isRunning_ = false;
        task_.join(); // <<<  Instead of detaching the thread, join() it.
    }

    ~Something() {
         this->stop();
    }        

private:
    std::atomic<bool> isRunning_;
    std::thread task_;
    void someTask()
    {
        this->isRunning_ = true;
        while(this->isRunning_) {
            // do something forever
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

拆除std::thread通常不是一个好主意,除非有某种同步设置,允许等待线程执行在整个过程结束之前结束.


通常fork()通过创建后台子进程来实现对进程的演示,并让父进程将控制权返回给调用者.