나는 부스트 스레드를 사용하는 C++ 98 프로젝트를 가지고 있습니다.()스레드와 신호
이for(int i=0;i<numCPU;++i)
{
vThreads.push_back(new boost::thread(boost::bind(&TControl::startCPU,this,i,fnp)));
}
및 작업자 스레드가 getWork만큼 실행 workunits를 반환 : 메인 스레드는이 같은 12 개 쓰레드를 생성
void startCPU(int id,StartFn fnp)
{
unused(id);
while(true)
{
WU_TYPE* pWU(getWork());
if(pWU==NULL) return;
CALL_MEMBER_FN(pWU,fnp)();
}
}
특정 workunits은 매우 긴 실행할 수 있습니다. 목표는 이미 스레드가 (startCPU (void)를 실행하는) 새로운 작업 단위를 시작할 수 있도록 이미 60 분 이상의 런타임을 가진 작업 단위를 죽이는 것입니다.
처음에는 신호로 처리 할 수 있다고 생각했는데, 주 스레드가 매분마다 신호를 올릴 수 있고 각 스레드 내부의 신호 처리기가 지연된 작업 단위에 대한 예외를 throw 할 수 있습니다. 그러나 조금 읽은 후에는 한 스레드에서 발생한 신호가 다른 스레드의 신호 처리기를 시작하지 않기 때문에 이렇게 작동하지 않는 것 같습니다. 맞습니까? 이 목표를 달성하기위한 적절한 기술은 무엇입니까?
참고 : C++ 11을 사용할 수 없으므로 소프트웨어는 이전 시스템에서 컴파일해야합니다.
종료 시간이 지난 경우 -> 현재 시간 확인 -> 종료 시간 남음 ->이 변수 설정은이 스레드가 완료된 작업 단위를 표시합니다. – Detonar
CALL_MEMBER_FN은 작업 단위 pWU의 멤버 함수 포인터 fnp를 실행하고 작업 단위가 완료 될 때까지 반환하지 않습니다. 목표는 fnp()를 매 순간 중단하고 죽일지를 점검하는 것입니다. – Geom