如何从自身加入std :: thread(在C ++ 11中)

时间:2015-10-23 23:13:18

标签: c++ multithreading c++11 boost-thread stdthread

我有std::thread等待并从套接字读取。并且存在指向存储在某处的thread的指针。但是当一些不好的事情发生并且thread结束时,我希望它调用一些导致函数加入该线程的东西,然后删除引用它的指针。 (我可以从线程中访问该指针)

我可以在另一个线程中执行此操作,但随后新线程成为问题。

2 个答案:

答案 0 :(得分:3)

更改您的设计,以便您没有这种奇怪的要求。一个简单的解决方案是将shared_ptr用于拥有该线程的控制结构,并具有其他状态信息。该线程可以将shared_ptr保存到此控件结构,并使用它将其状态报告给任何其他感兴趣的代码。当没有人关心这个线程时,这个控制结构的最后shared_ptr将消失,它将被销毁。

答案 1 :(得分:2)

您可以在分离状态下创建线程,并使线程生存期依赖于条件变量,并在完成时切换布尔状态。

#include <thread>
#include <iostream>
#include <unistd.h>
#include <condition_variable>
#include <mutex>

class A {
    private:
        void Threadfunction();
        volatile bool class_running;
        volatile bool thread_running;
        std::condition_variable cv;
        std::mutex mu;
    public:
        A();
        ~A();
        void Stop();
};
A::A(){
    class_running = true;
    thread_running = false;
    std::thread t(&A::Threadfunction,this);
    t.detach();
}
A::~A(){
    if(class_running) {this->Stop();}
}
void A::Stop() {
    std::unique_lock<std::mutex> lk(mu);
    class_running = false;
    while(thread_running) {
        cv.wait(lk);
    }
    std::cout << "Stop ended " << std::endl;
}
void A::Threadfunction(){
    thread_running = true;
    std::cout << "thread started " << std::endl;
    while(class_running){
        // Do something
    }
    thread_running = false;
    cv.notify_one();
    std::cout << "thread stopped " << std::endl;
}
int main(){
    A a1;
    A a2;
    sleep(1);
    std::cout << "a1.Stop() called " << std::endl;
    a1.Stop();
    sleep(1);
    std::cout << "a2.Stop() not called but a2 goes out of scope and destructor is called " << std::endl;
}