함수 foo()를 일정 기간 만 실행하려면 어떻게합니까? 스레드가 가장 흔한 충돌 방법이라고 생각합니다.1 분 동안 만 함수를 실행하는 방법
어떻게 bind 및 timed_join을 사용합니까 ??
함수 foo()를 일정 기간 만 실행하려면 어떻게합니까? 스레드가 가장 흔한 충돌 방법이라고 생각합니다.1 분 동안 만 함수를 실행하는 방법
어떻게 bind 및 timed_join을 사용합니까 ??
코드는 다른 코드와의 전쟁이 아닙니다. 코드가 협조하여 작업을 완료합니다. foo
을 1 분 동안 만 실행하려면 코드를 1 분 동안 만 실행하도록 코딩하십시오. 다른 방법으로 코드를 작성하지 말고 코딩 된 방식이 아닌 다른 방식으로 코드를 작동 시키십시오.
스레드를 사용하려는 경우 foo
을 코딩하여 동기화 된 "중단"플래그를 확인할 수 있습니다. foo
플래그가 설정되면 플래그가 설정되면 중단됩니다. 그런 다음 잠시 후 다른 스레드에서 해당 플래그를 설정하십시오. 그런 다음 foo
은 플래그가 설정되고 자체를 중단 함을 알립니다.
I/O 작업을 차단하는 것과 같은 작업을 중단해야하는 경우 솔루션은 플랫폼에 따라 다릅니다. 또는 Boost과 같은 기능을 제공하는 휴대용 라이브러리를 사용할 수 있습니다.
일부 스레드 API는 제어 스레드가 다른 스레드의 취소를 강제하는 데 사용할 수있는 명령을 "실험"했습니다. 표면적으로는 매력적이지만 실제로 취소 된 스레드는 쉽게 일부 리소스 (힙, 잠금, 파일 디스크립터 (descriptor))를 사용하면됩니다. 많은 시스템과 라이브러리 호출은 이러한 리소스를 잠시 꺼내므로 자신의 소스 코드를 스캔하는 것이 아닙니다. 집중적 인 수학 계산과 같은 매우 제한된 시나리오의 경우에만 안전합니다. 현재 취소 된 API는 거의 없습니다. –
나는 당신이 무엇을 요구하고 있는지 정확히 알지 못합니다. 잠깐 동안 무언가를 할 수있는 함수가 필요하다면 while 루프로 감쌀 수 있을까요?
void foo(void)
{
time_t end = time(NULL) + 60;
while (time(NULL) <= end)
{
… // do something
}
}
// something something 문을 20 분 동안 실행하면 코드가 20 분 동안 실행됩니다. 매 초마다 코드를 검사해야하므로 60 초가 지나면 명령문에서 벗어납니다. 이해하니? –
@georgemano : 그럼'/ do something'의 시간 체크를 넣으십시오. 당신의 질문은 너무 모호하여 구체적으로 대답 할 수 없습니다. – ildjarn
@georgemano 어떻게해야할지 모르겠다. 반복하지 않고 20 분 동안 실행되는 코드를 작성한다면, 내가 다루어야했던 것보다 훨씬 큰 문제가 생길 것이다. 내가 본 모든 장기 실행 코드는 본질적으로 루프 (네트워킹 루프, 연산 루프, 애니메이션 루프, 명령 루프 등)되었습니다. 미안하다. 충고는별로 도움이되지 못했다. –
어떻게 시간의 기간 동안 실행() 함수 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::bind
과 boost::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));
'foo'는 그렇게하는 것이 바람직할까요? – ildjarn
이 질문에 대한 답변 : http://stackoverflow.com/questions/1015494/can-i-create-a-software-watchdog-timer-thread-in-c-using-boost-signals2-andthth – loki11
아마도 [한 가지 질문] (http://stackoverflow.com/questions/11174598/stop-functions-in-5-minutes-if-the-dont-end-running)을 고수해야합니다. 더 많은 관심이 필요하다고 느끼면 그 위에 현상금을 부과 할 수 있습니다. – chris