C++在线程外平滑结束线程
时间: 2023-12-29 19:18:00 浏览: 50
在线程外平滑结束线程,可以使用以下方法:
1. 给线程设置一个退出标志,当需要结束线程时,将该标志设置为 true。在线程的执行函数中,使用该标志来判断是否需要结束线程,如果退出标志为 true,则线程执行完当前任务后自行结束。
2. 使用条件变量(std::condition_variable)和互斥锁(std::mutex)来实现线程的平滑结束。在线程的执行函数中,使用条件变量等待某个条件的发生,当需要结束线程时,通过条件变量通知线程退出,并在退出前释放互斥锁。
下面是一个简单的示例代码,用于演示如何在线程外平滑结束线程:
```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
std::mutex mtx;
std::condition_variable cv;
bool exit_flag = false;
void thread_func()
{
while (true)
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return exit_flag; });
if (exit_flag)
{
// 执行清理操作
std::cout << "Thread exited gracefully.\n";
break;
}
}
}
int main()
{
std::thread t(thread_func);
// 等待一段时间后结束线程
std::this_thread::sleep_for(std::chrono::seconds(3));
{
std::lock_guard<std::mutex> lock(mtx);
exit_flag = true;
}
cv.notify_one();
t.join();
return 0;
}
```
在上面的代码中,线程函数 `thread_func` 中使用了 `std::unique_lock` 来锁定互斥锁 `mtx`,然后调用 `cv.wait` 等待条件变量 `cv` 的通知,如果收到退出通知,则执行清理操作并退出函数。在主函数中,等待一段时间后,设置退出标志为 true,并通过 `cv.notify_one` 发送通知给线程,然后等待线程结束。这样就实现了在线程外平滑结束线程的功能。