[완료] C++11 std::thread, 강제종료 할 수 없는건가요?
글쓴이: twinwings / 작성시간: 토, 2015/07/04 - 9:12오후
#include <iostream>
#include <thread>
class hello
{
public:
void run()
{
tid = std::thread(std::bind(&hello::forever, this));
}
private:
void forever()
{
while(1)
{
std::cout << "hello" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
private:
std::thread tid;
};
int main()
{
hello h;
h.run();
std::this_thread::sleep_for(std::chrono::seconds(10));
return 0;
}main에서 빠져나오면서 hello의 소멸자가 호출되고,
tid의 소멸자가 차례로 호출되면서 쓰레드가 죽을 것이라 예상했지만 전혀 아니더군요
$ ./a.out hello hello hello hello hello hello hello hello hello hello terminate called without an active exception 중지됨 (core dumped)
(흔히, join 안했을 때 보던 문구...)
구글님에게 여쭤보니 std::thread::native_handle() 이용해서 직접 죽여라.. 라던데
언어차원에서 지원안해주는건가요? 설마?
Forums:


해결했습니다.
pthread의 경우 소멸자에서 join 없이 바로 pthread_cacel() 호출해도 아무런 문제가 발생하지 않던데,
std::thread의 경우, std::thread::native_handle() 이용해서 pthread_cancel() 호출하니
에러가 발생하더군요.
을
그래서 접근방법을 바꾸니까 해결됐습니다.
#include <iostream> #include <thread> #include <pthread.h> #include <atomic> class hello { public: hello() { condition.store(true); } ~hello() { condition.store(false); if(tid.joinable()) { tid.join(); } } void run() { tid = std::thread(std::bind(&hello::forever, this)); } private: void forever() { while(condition) { std::cout << "hello" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } } private: std::thread tid; std::atomic_bool condition; }; int main() { hello h; h.run(); std::this_thread::sleep_for(std::chrono::seconds(2)); return 0; }댓글 달기