클래스에서 optimize() 무한루프 돌리는 스레드 하나 만들어놓고
외부에서는 startOptimizationThread() 호출해서 시작하고
끝내고싶을 때 stopOptimizationThread() 하는 코드임
bool thread_stop_requested_; 이거랑 mutex 가지고 스레드 끝낼지말지 결정하거든
이렇게 짜는거 맞냐? 효율적인 방법 있냐?
public: void startOptimizationThread(); void stopOptimizationThread();...
std::thread optimization_thread_;
std::mutex thread_stop_mutex_;
bool thread_stop_requested_;...};
void Optimizer::startOptimizationThread(){ thread_stop_requested_ = false; optimization_thread_ = std::thread( std::bind(&Optimizer::threadEnter, this) );}
void Optimizer::stopOptimizationThread(){ thread_stop_mutex_.lock(); thread_stop_requested_ = true; thread_stop_mutex_.unlock();
optimization_thread_.join();}
void Optimizer::threadEnter(){ optimize();}
void Optimizer::optimize(){ while (true) { // test thread stop thread_stop_mutex_.lock(); if (thread_stop_requested_) return; thread_stop_mutex_.unlock();
// TODO: optimize }}
<!--EndFragment-->
Optimizer 객체에 대해서 레이스 컨티션이 생기는거? 쓰레드 간의 공유 객체가 아니면 굳이 접근에 뮤텍스 걸어줄 필요가 없을 것 같은데. Optimize() 안에는 왜 뮤텍스가 걸리는거임? 그리고 std::bind로 생성 안 해줘도 될 것 같은데
thread_stop_requested_ 이변수 접근할 때 레이스컨디션 생길거같아서 그 변수 접근용으로 thread_stop_mutex_ 뮤텍스 써봤음
전에 pthread 대충 써본적 있는데, 클래스 멤버함수로 스레드 시작할 때 저런식으로 std::bind였나 boost::bind 했었음
저 변수를 접근할 때 레이스 컨디션이 생기려면, 여러 쓰레드에서 공유된 Optimizer에 한번에 stop 메소드에 접근해야된다는 얘기인데 그렇게 사용할껀지 의문? 공유하게 될 상황이 생길까 이상할 것 같은데.. 그리고 Optimize() 안에는 왜 뮤텍스가 있는겨
std::thread() 는 안에 bind 비슷한 기능이 있어서 굳이 안 해도 됨 그냥 메소드만 넣어주셈
오홍 ㄱㅅㄱㅅ
Optimize() 내부에 뮤텍스가 있는게 말이 되려면 내부 stop_requested 변수를 여러 쓰레드가 한번에 접근하고 수정까지 해야되는 상황인건데, 일단 현재 구현 상으로는 한 Optimizer 는 하나의 쓰레드만 가지는데다가 쓰레드가 여러개 있다 치더라도 변수를 수정하는게 아니라 참조만 하는거니까 뮤텍스가 없어도 될 것 같음
thread_stop_requested_를 공유하지 않을까? 한 스레드에서는 thread_stop_requested_=true;로 write를 하고, 다른 스레드 (optimize() 함수) 에서는 if (thread_stop_requested_) 여기서 read를 함 두 스레드에서 한 변수에 read write를 하는데 여기에 앞뒤로 뮤텍스 걸어야 한다고 생각했음
그리고 저거 이미 돌아가고 있는 도중에 stop 메소드 호출되기 전에 start 한번 더 호출하면, 원래 있던 쓰레드 레퍼런스에 다른 쓰레드 넣어버려서 원래 쓰레드에서 terminate() 호출돼서 프로그램 날라감. 그래서 start메소드에서 에서 싱글턴처럼 현재 스레드가 이미 돌아가고 있는지 확인도 해줘야 됨
현상황: 저 클래스 객체는 메인쓰레드에서 생성되고, 메인쓰레드에서 startOptimizationThread() 함수 호출함으로써 optimize() 함수를 돌리는 쓰레드 생성됨. 메인쓰레드에서 optimize() 함수 쓰레드를 원하는 때 멈추고 싶고, 그때 stopOptimizationThread() 함수를 호출함
ㅇㅋ 저거 메인쓰레드에서 단 한번만 호출될것임
쓰레드가 write를 하는게 아니잖아? 쓰레드가 write 를 하면 현재 Optimizer 안에 있는 쓰레드 말고 밖에서 쓰레드를 운용한다는 얘기인데?
메인 쓰레드 하나니까 뮤텍스 필요 없다고 생각함 ㅇㅇ
제대로돔? 안될꺼 같은데
도데체 스톱하고 조인을 왜하는건데
조인이 뭘까
아 내가 뮤텍스개념을 잘못알고있는건가 ㅠㅠ 일단 뮤텍스없애고 테스트해도 돌아감. thread1 = (프로그램 시작할 때 생긴 main thread). thread2 = (std::thread로 생성된 optimization_thread_). thread1 에서는 public함수인 stopOptimizationThread() 호출하는데 여기서 thread1: thread_stop_requested_ = true; 하게됨. thread2에서는 iteration마다 if (thread_stop_requested_) return; 하면서 변수값에 따른 분기를 함
thread1: thread_stop_requested_ = true; thread2: if (thread_stop_requested_) return;
thread_stop_requested_가 두 스레드에서 접근되는걸로 생각했는데
끝난스레드 청소할때 join쓰는거 아님?
쓰레드가 왜 2개임 보닌이 올린 소스에서는 멤버 쓰레드 하나 밖에 안 보이는디
스톱하고 나서 조인해도 됨
컴퓨터공학 대학원생은 아닌거죠?
ㅋㅋㅋ//도데체->도대체 (국어사전 - 도대체 (都大體)[부사] : 1. 다른 말은 그만두고 요점만 말하자면. 2. 유감스럽게도 전혀.) [리듬 맞춤법 봇♬]
int main() { Optimizer o; o.startOptimizationThread(); ... } 메인함수하나, o::optimize() 하나 해서 총 두개
학부대학원 둘다 컴공과에여 ㅠㅠ
아 메인 쓰레드랑 멤버 쓰레드 해서 2개
스톱이란게 의미하는게 스레드의 sleep을 말하는거냐 스레드의 return 을말하는거냐 스레드의 terminate를 말하는거냐 무슨 대답이던 상관없지만
상관 없지 왜냐하면 한쪽에서만 write 권한을 갖고 있으니까 동시에 참조해서 write 랑 동시에 read 해도 while 문이 딴 한번 더 도는 것뿐 체감상의 차이는 없을듯
ㅋㅋㅋ/ 리턴이지
스레드 리턴하고 조인하는 이유는?
std::thread 는 조인 또는 디태치 하지 않으면 terminate() 호출해서 프로그램 터뜨림
쓰레드 만든데서 조인하는거 아니냐? 몰르니까 물어봤죠 가르쳐주세요
[msca**(고정닉) : 갤로그로 이동합니다.] std::thread 는 조인 또는 디태치 하지 않으면 terminate() 호출해서 프로그램 터뜨림 <- 이말은 어느책에서 어느 레퍼런스에서 본거에요?
그냥 누가 이야기 하길래 한번 물어본거임 쓰레드 만든데서 조인하는게 맞음
뭐 무조건은 아니고 대체적으로 맞음
C++ CIA 에서 봤는데 C++11 기준
뮤택스 없어도 될거가튼데
특히 메인스레드에서 생성한 스레드가 다 돌기도 전에 메인스레드가 리턴되는걸 막아주는게 조인이랑 디테치
쓰레드 만들때 멈추는 플래그를 ref로 감싸서 만들고 바로 detach해준다음에 와일 조건에 !플래그 이런 느낌으로
ㄴ 이 상황에서 terminate 호출된다는거
std::thread 가 조인하면 terminate를 호출한다. ---- 누가? 워커스레드가? 메인스레드가?
C++ CIA 에서 봤는데 C++11 기준 -> 과연 정말이면 ... 내가 그동안 너무 표준 바뀌는걸 확인안했거나.. 내가 무지한거겠지
메인에서 터지는거 맞지아늠? 그냥 잘도는건 부스트고 표준은 터지고
잠만 확인해보고 새로 글 싸겠음
메인이고 자시고 쓰레드 핸들러가 스코프 나갈때 소멸자에서 터지는걸텐데
쉬바.. 공부하고온다
ㅋㅋㅋ//거에요->거예요 (받침 있으면 이에요 없으면 예요 이로 끝나면 받침 없으므로 예요 요 떼서 말 되면 에요 아니에요는 예외 인명엔 예요(예 : 길동이예요) 성까지 쓰면 이에요(예 : 홍길동이에요)) [리듬 맞춤법 봇♬]
terminate를 호출하긴 하지만 스레드내부에서 예외가 발생하거나 (물론 예외를 핸들하면 아님) 스레드가 뒤지기 """"전에"""" 조인안하면 terminate가 콜됨
리턴하고 나서 하는게 오히려 깔끔한 것 같은데 메인 쓰레드도 그러면 조인 하고 나서 안 멈출 것 아냐 이미 리턴된게 보장돼있으니까
구려구려 아이구려띠
스레드가 뒤지다 리턴되다 ************전에 조인안하면 terminate가 콜됨
? 뭔 소리임 아님
쓰레드가 리턴해도 소멸자 호출 안됨
C++ 표준라이브러리 니콜라이 조슈티스 동시성 파트의 18.2.1 보삼