我正在学习多线程,我写了这段代码:
#include <iostream>
#include <mutex>
#include <thread>
#include <string>
#include <chrono>
#include <condition_variable>
int distance = 20;
int distanceCovered = 0;
std::condition_variable cv;
std::mutex mu;
void keep_moving(){
while(true){
std::cout << "Distance is: " << distanceCovered << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
distanceCovered++;
if(distanceCovered == distance){
cv.notify_one();
std::terminate();
}
}
}
void wake_me_up()
{
std::unique_lock<std::mutex> ul(mu);
cv.wait( ul, []{ return distanceCovered==distance; }); // protects the lines of code below
std::cout << "I'm here" << std::endl;
std::terminate();
}
int main() {
std::thread driver(keep_moving);
std::thread wake_me(wake_me_up);
driver.join();
wake_me.join();
system("pause");
return 0;
}
正如您所见,线程'keep_moving'在20秒内从0-20开始计数,然后通知'wake_me_up'线程打印“我在这里”,然后终止。通知线程后,'keep_moving'线程也会终止。
如果我以正确的方式终止线程,请告诉我。当我运行此代码时,我收到以下消息:
terminate called without an active exception
I'm here
terminate called recursively
Aborted
谢谢。
答案 0 :(得分:14)
没有。终止线程的正确方法(在标准C ++中唯一正确)是从其线程函数返回。
std::terminate
会杀死整个过程。即使它只杀死当前线程(即表现得像Win32 TerminateThread
函数,你应该从不调用!),它不会解除堆栈,不要调用析构函数,因此可能会留下一些未完成的必要清理(比如释放互斥体)。
std::terminate
旨在用于您的程序无法继续的严重故障。消息&#34;没有活动异常&#34;是因为terminate
的主要用途是在异常系统失败时终止程序,例如由于嵌套异常,因此该函数默认查找活动异常并打印有关它的信息。