mfc模拟实现多个线程其中有一个线程没退出检查线程所有线程是否退出未退出的线程安全退出
要实现多个线程的模拟,可以使用C++中的std::thread类来创建和管理线程。下面是一个示例代码,该代码创建了两个线程,其中一个线程没有退出。然后,使用std::atomic_bool变量来检查所有线程是否退出,并使用条件变量和互斥锁来安全退出未退出的线程。
#include <iostream>
#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>
std::atomic_bool allThreadsExited(false); // 标志变量,表示所有线程是否都退出
std::mutex mtx; // 互斥锁,用于保护条件变量
std::condition_variable cv; // 条件变量,用于等待线程退出信号
void threadFunc1()
{
// 线程1的任务
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "Thread 1 exiting" << std::endl;
}
void threadFunc2()
{
// 线程2的任务
while (!allThreadsExited)
{
std::cout << "Thread 2 is running" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Thread 2 exiting" << std::endl;
}
int main()
{
std::thread t1(threadFunc1);
std::thread t2(threadFunc2);
t1.join();
{
std::lock_guard<std::mutex> lock(mtx);
allThreadsExited = true;
}
cv.notify_all(); // 通知等待线程退出的条件变量
t2.join();
std::cout << "All threads exited" << std::endl;
return 0;
}
在上述代码中,线程1通过睡眠3秒来模拟执行任务,然后退出。线程2在一个循环中运行,直到标志变量allThreadsExited为true时退出。在主线程中,首先通过t1.join()等待线程1退出,然后设置标志变量为true,并通过条件变量的notify_all()通知线程2退出。最后,通过t2.join()等待线程2退出。
在设置标志变量和通知条件变量时,需要使用std::mutex来保护共享数据,以避免并发访问的问题。通过使用std::lock_guardstd::mutex来自动管理互斥锁的锁定和解锁,确保在修改标志变量和通知条件变量之前,互斥锁已经被锁定,并在退出作用域时自动解锁。
这样,就能实现多个线程的模拟,并安全退出未退出的线程
原文地址: https://www.cveoy.top/t/topic/iVsn 著作权归作者所有。请勿转载和采集!