c++ 如何在kill 线程时执行析构函数
时间: 2024-09-18 13:16:19 浏览: 60
在C++中,当主线程(通常父线程)发送一个`SIGINT`或`SIGTERM`信号给子线程时,可以通过一些机制确保子线程在退出之前执行析构函数。这里的关键在于使用`std::unique_ptr`或`std::shared_ptr`这类智能指针来管理对象,因为它们会在析构函数被调用时自动清理资源。
**示例**:
1. **使用`std::unique_ptr`**[^1]:
```cpp
#include <thread>
#include <atomic>
#include <exception>
class Service {
public:
~Service() { /* 这里会自动执行 */ }
void doWork() {
while (!shouldExit.load()) {
// ... 执行工作
}
}
private:
std::atomic<bool> shouldExit{false};
};
int main() {
std::unique_ptr<Service> service(new Service());
std::thread workerThread(service->doWork);
// 模拟收到信号
shouldExit.store(true);
workerThread.join(); // 等待子线程结束
return 0;
}
```
2. **使用`std::function`或`std::bind`结合`pthread_cleanup_push`/`pthread_cleanup_pop`**[^2] (适用于多线程环境):
```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
#include <pthread.h>
class Service {
public:
~Service() { /* 这里会自动执行 */ }
void startWorking() {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, []{return shouldExit;}); // 等待信号
}
private:
std::mutex mutex_;
std::condition_variable condition_;
bool shouldExit = false;
};
int main() {
Service service;
pthread_t thread;
pthread_cleanup_push([](void* arg) {
static_cast<Service*>(arg)->~Service();
}, &service);
if (pthread_create(&thread, nullptr, &service.startWorking, &service)) {
// 处理错误...
}
// 发送信号
service.shouldExit = true;
// 等待清理完成
pthread_cleanup_pop(1);
pthread_join(thread, nullptr);
return 0;
}
```
阅读全文