2012-06-29 2 views
-1

함수 foo()를 일정 기간 만 실행하려면 어떻게합니까? 스레드가 가장 흔한 충돌 방법이라고 생각합니다.1 분 동안 만 함수를 실행하는 방법

어떻게 bind 및 timed_join을 사용합니까 ??

+1

'foo'는 그렇게하는 것이 바람직할까요? – ildjarn

+0

이 질문에 대한 답변 : http://stackoverflow.com/questions/1015494/can-i-create-a-software-watchdog-timer-thread-in-c-using-boost-signals2-andthth – loki11

+0

아마도 [한 가지 질문] (http://stackoverflow.com/questions/11174598/stop-functions-in-5-minutes-if-the-dont-end-running)을 고수해야합니다. 더 많은 관심이 필요하다고 느끼면 그 위에 현상금을 부과 할 수 있습니다. – chris

답변

3

코드는 다른 코드와의 전쟁이 아닙니다. 코드가 협조하여 작업을 완료합니다. foo을 1 분 동안 만 실행하려면 코드를 1 분 동안 만 실행하도록 코딩하십시오. 다른 방법으로 코드를 작성하지 말고 코딩 된 방식이 아닌 다른 방식으로 코드를 작동 시키십시오.

스레드를 사용하려는 경우 foo을 코딩하여 동기화 된 "중단"플래그를 확인할 수 있습니다. foo 플래그가 설정되면 플래그가 설정되면 중단됩니다. 그런 다음 잠시 후 다른 스레드에서 해당 플래그를 설정하십시오. 그런 다음 foo은 플래그가 설정되고 자체를 중단 함을 알립니다.

I/O 작업을 차단하는 것과 같은 작업을 중단해야하는 경우 솔루션은 플랫폼에 따라 다릅니다. 또는 Boost과 같은 기능을 제공하는 휴대용 라이브러리를 사용할 수 있습니다.

+1

일부 스레드 API는 제어 스레드가 다른 스레드의 취소를 강제하는 데 사용할 수있는 명령을 "실험"했습니다. 표면적으로는 매력적이지만 실제로 취소 된 스레드는 쉽게 일부 리소스 (힙, 잠금, 파일 디스크립터 (descriptor))를 사용하면됩니다. 많은 시스템과 라이브러리 호출은 이러한 리소스를 잠시 꺼내므로 자신의 소스 코드를 스캔하는 것이 아닙니다. 집중적 인 수학 계산과 같은 매우 제한된 시나리오의 경우에만 안전합니다. 현재 취소 된 API는 거의 없습니다. –

1

나는 당신이 무엇을 요구하고 있는지 정확히 알지 못합니다. 잠깐 동안 무언가를 할 수있는 함수가 필요하다면 while 루프로 감쌀 수 있을까요?

void foo(void) 
{ 
    time_t end = time(NULL) + 60; 
    while (time(NULL) <= end) 
    { 
     … // do something 
    } 
} 
+1

// something something 문을 20 분 동안 실행하면 코드가 20 분 동안 실행됩니다. 매 초마다 코드를 검사해야하므로 60 초가 지나면 명령문에서 벗어납니다. 이해하니? –

+0

@georgemano : 그럼'/ do something'의 시간 체크를 넣으십시오. 당신의 질문은 너무 모호하여 구체적으로 대답 할 수 없습니다. – ildjarn

+1

@georgemano 어떻게해야할지 모르겠다. 반복하지 않고 20 분 동안 실행되는 코드를 작성한다면, 내가 다루어야했던 것보다 훨씬 큰 문제가 생길 것이다. 내가 본 모든 장기 실행 코드는 본질적으로 루프 (네트워킹 루프, 연산 루프, 애니메이션 루프, 명령 루프 등)되었습니다. 미안하다. 충고는별로 도움이되지 못했다. –

0

어떻게 시간의 기간 동안 실행() 함수 foo를해야합니까?

POSIX pthread API는 취소를 지원하지만 즉시 취소 할 수는 없습니다. 그러나 아래 그림은 정상적으로 5 초 동안 작동 할 때 1 초 후에 어떤 기능을 취소하는 데 사용되는 방법을 보여줍니다 (foo).

void foo() 
{ 
    sleep(5); 
} 

void * start_foo (void *) 
{ 
    int x; 
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &x); 
    foo(); 
    return 0; 
} 

    pthread_t t; 
    pthread_create(&t, 0, start_foo, 0); 
    sleep(1); 
    pthread_cancel(t); 
    pthread_join(t, 0); 

start_foo 함수는 소거 상태로 할 수있다. x 매개 변수는 이전 취소 상태를받습니다.

어떻게 bind 및 timed_join을 사용합니까 ??

저는 boost::bindboost::thread::timed_join을 언급하고 있습니다. boost::bind은 인수를 취하지 않고 인수가 전달되는 함수를 호출하는 기능을 정의하는 메커니즘을 제공합니다. boost::thread에는 인수를 사용하지 않는 펑터가 필요하므로 여기에서 사용됩니다.

boost::thread t(boost::bind(puts, "hello, world")); 

boost::thread::timed_join는 스레드가 전달 된 시간 매개 변수 내에서 완료되지 않은 경우 false를 반환 할 수 있다는 boost::thread에 참여한다.

boost::thread t(foo); 
t.timed_join(boost::posix_time::seconds(1)); 
관련 문제