2014-07-17 5 views
0

내가 전화했을 때, (독점)이 다른 작업을 실행할 수있는 간단한 기능을 쓰고 있어요.선택 : 시간이 만료 된 사용자 입력

그래서 두 개의 스레드가 있습니다. 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;   
    } 
} 

답변

0

타이머 용 스레드를 만드는 것이 일반적으로 차선 설계입니다. 확장 성이 좋지 않고 (수천 개의 타이머를 상상해보십시오) 코드는 정당한 이유없이 멀티 스레드 및 더 복잡해집니다. 또한, sleep is not thread-safe on Linux.

그냥 select 및 타임 아웃 하나 개의 스레드를 사용합니다. select은 사용자 입력과 시간 초과에 대해 동시에 STDIN_FILENO을 기다립니다.

libevent 또는 boost::asio과 같은 제 3 자 이벤트 디 멀티플렉싱 라이브러리를 사용하는 것이 좋습니다.

+0

감사합니다. 그러나이 솔루션을 사용하여 "getline"문제를 해결하지 못했습니다 ... – gepeppe

+0

@gepeppe 사용 권한이 있습니다. 'STDIN_FILENO'가 읽을 준비가되면 그곳에서 읽는 것이 차단되지 않습니다 (그러나 전체 줄을 읽으려면 논 블로킹 I/O를 사용해야합니다). –