c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데
이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는
함수가 없어서 조금 아쉬운 애다.
std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든
start 함수가 없어서 선언되자마자 실행된다
그리고 저번에 서버 프로그램 만들 때 쓰면서 알게 된 사실인데
스레드는 완전하게 독립된 상태가 아니라
스레드 코드가 끝나기 전에 선언했던 본문이 먼저 끝나면
이와 같이 abort 오류가 발생함
그래서 detach 함수로 독립시켜주거나 join을 호출해야 한다
스레드를 실행했다면 종료시키는 방법은
이제 스레드 코드가 알아서 끝날때 까지 기다리면 된다
면... 무한반복문의 경우 어떻게 할 수 없기 때문에 뭔가 해줘야 함
그래도 외부 변수로 반복하는 스레드의 경우
합법적으로 종료 시킬 수 있음
외부 변수를 false로 대입하고
join 하면 해당 스레드가 종료될 때까지 기다린다
그런데 출력에 이상이 생긴 걸 알 수 있음
cout 에서 버퍼링?에 사용하는 자원에 동시 접근해서 발생한것으로 추측
그래서 자바처럼 같은 자원에 접근 할 때 생기는 문제를 해결하기 위해
동기화 synchronized 와 비슷한 mutex가 있다.
얘는 변수로 선언해서 써야 하는데
이런식으로 출력에 생긴 문제를 해결하는 모습을 볼 수 있다.
lock 함수로 공유 자원에 대한 접근을 대기 시키고
unlock 으로 대기 해제 시킨다
이후 스레드를 끝내고 join해서 코드가 완전히 종료될 때 까지 기다림
그럼 스레드가 끝났는지 확인하는 법은?
이것도 외부변수로 체크함...
thread에 joinable 함수가 있긴 하지만
join이나 detach 했는지를 확인하는 함수라
스레드가 아직 실행 중인지 확인하는 좋은 방법은 아닌듯 하다
그렇다고 thread를 강제 종료시킬 수도 없다...
프로세스가 끝나면 어차피 다 강제 종료된다


댓글 없음:
댓글 쓰기