我有std::thread
等待并从套接字读取。并且存在指向存储在某处的thread
的指针。但是当一些不好的事情发生并且thread
结束时,我希望它调用一些导致函数加入该线程的东西,然后删除引用它的指针。 (我可以从线程中访问该指针)
我可以在另一个线程中执行此操作,但随后新线程成为问题。
答案 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;
}