2013-01-02 9 views
0

while() 루프를 블로킹 메서드와 결합하는 데 문제가 발생했습니다. 나는 (진정한) + 회피 조건을 사용하여 쉽게 볼 수 있습니다.while (true), 이스케이프 조건 및 블로킹 방법

while(true) 
{ 
    //this is my blocking method 
    BlockingMethod(); 

    //do other things here 

    //escape condition to get out of the loop 
    if(escape_condition) { break; } 

} 

내 관심사는 스레드가 동안() 루프 내부에 도착하면,이 차단 방법에 붙어, 그리고 나가 탈출 조건에 도달되지 않습니다이다. 이 문제를 어떻게 처리 할 수 ​​있습니까?

또한 내 코드가 이와 동일하다고 생각합니까? 맞습니까?

while(!escape_condition) 
{ 
    //this is my blocking method 
    BlockingMethod(); 

    //do other things here 

} 

또는 입구 조건이 충족되는 블로킹 방법으로 스레드가 멈추고 꺼내지 않습니까? (루프 내부에 이스케이프 조건을 구현해야합니다.)

+0

동일하거나 유사한 경우 'escape_condition'의 초기 상태에 따라 다릅니다. 첫 번째 코드는 적어도 한 번 이상'BlockingMethod'를 호출 할 것이고, 후자는 결코 그것을 호출하지 않을 것입니다. (하지만 .. * 다시 * 질문입니까?) –

+0

하지만 차단 방법을 호출 한 후 코드를 종료 할 수 있습니까? =/ – CaTx

+0

글쎄,'BlockingMethod'가 현재 실행을 블로킹 *했을 때, 확실히. 스레딩 (또는 다른 동시성)이 사용되지 않는 한 프로그램은 멋진 정리 순서로 실행됩니다 .. –

답변

0

나는 BlockingMethod를 제어 할 수 없다고 생각합니까? 즉, 시간 제한 값을 사용하여 함수가 영원히 차단되지 않도록 변경할 수는 없습니다.

그렇다면 Freeing하지 않으려면 BlockingMethod() 호출을 별도의 스레드로 돌리는 것을 고려해야합니다. 그런 다음 while 루프를 수정하여 스레드가 여전히 실행 중인지 확인하고 필요에 따라 잠자기하고 상황에 너무 오래 걸리는 경우 스레드를 제거하고 복구 할 수 있습니다.

+0

차단 방법은 AcceptSocket() 또는 AcceptTcpClient()입니다. =/ – CaTx

+0

그런 다음 잠재적으로 영원히 차단하지 않으려면 별도의 스레드로 이동해야합니다. – spartygw