내가 전화했을 때, (독점)이 다른 작업을 실행할 수있는 간단한 기능을 쓰고 있어요.선택 : 시간이 만료 된 사용자 입력
그래서 두 개의 스레드가 있습니다. User_choice
은 사용자가 입력을 삽입 할 때까지 대기하고 Time_choice
은 시간이 만료 될 때까지 대기합니다.
choice_done
공유 VAR는 true의 경우, 하나 개의 스레드가 이미 시작하고있다,라고 말한다 (이것은 아무것도하지 않습니다!) 다른 하나를 차단; thread_done
말하는 반면, true의 경우, 해당 스레드는 (은 상관 없습니다) 이미 완료, 그래서 한 하나 개의 스레드가 완료 될 때까지 func()
기다립니다.
다음은 코드입니다.
func
절차는 프로그램 실행 중에 더 많이 호출됩니다.
다양한 user_choice
스레드는 getline
에 영원히 기다리고있을 것입니다! 이게 문제가 되나요? 네 번이 프로그램이 func()
을 호출하고 아무 것도 삽입하지 않으면 사용자가 "예"를 5 번 삽입하면 어떻게됩니까?
모든 user_choice
스레드가 계속 실행됩니까 ?? 은 대기 스레드 인을 어떻게 죽일 수 있습니까? 다른 솔루션이 있습니까?
func()
에서 스레드가 thread_done
을 true로 설정하는 것을 어떻게 기다릴 수 있습니까?
bool choice_done = false;
bool thread_done = false;
void func(){
boost::thread t1(boost::bind(time_choice()));
boost::thread t2(boost::bind(user_choice()));
//whait untile thread_done == true
do something...
}
// Time choice thread
void time_choice(){
sleep(5);
if(choice_done == false){
printf("Automatic choice\n");
choice_done == true;
do something...
thread_done = true;
}
}
// User choice thread
void user_choice(){
printf("Start emergency procedure?\n");
string tmp;
getline(cin, tmp);
if((tmp.compare("yes") == 0) && (choice_done == false)){
printf("Manual choice\n");
choice_done == true;
do something...
thread_done = true;
}
}
감사합니다. 그러나이 솔루션을 사용하여 "getline"문제를 해결하지 못했습니다 ... – gepeppe
@gepeppe 사용 권한이 있습니다. 'STDIN_FILENO'가 읽을 준비가되면 그곳에서 읽는 것이 차단되지 않습니다 (그러나 전체 줄을 읽으려면 논 블로킹 I/O를 사용해야합니다). –