2017-12-13 37 views
0

Linux 환경에서 개발 중입니다. 내 소프트웨어에서 3 개의 스레드, t1, t2 및 t3이 실행되고 있다고 가정합시다 (pthread를 사용하여 구현 됨). 인터리빙이없는 스레드 t1과 t2의 실행 시간은 50ms에서 100ms 사이입니다. 어쨌든 내가 30ms (즉, t3가 실행을 마친 후에 (sched_yeild()) 인터럽트를 발행 할 스레드 t3을 구현할 수 있습니까? 다음 실행은 그 시점 이후 30ms가 될 것이고 30ms 시간 초과가 발생하면 yield됩니다. 스레드가 실행 중이고 스레드가 완료 될 때까지 스레드 t3을 실행합니다. [sched_yeild()])? 다음은 내 코드의 구조입니다 : 당신은 (높은 우선 순위를 통해 예를 들어 것은 sched_setscheduler (0, SCHED_RR, ...을 T3 실행 할 수 있습니다멀티 스레드 프로그램 용 C++ 타이머 인터럽트

#include <pthread.h> 
#include <sched.h> 
    //others header files 
void* thread1(void *){ 
    while(1){ 
    //code for thread1 :loop time about 50ms-100ms 
    sched_yield(); 
    } 
} 
void* thread2(void *){ 
    while(1){ 
    //code for thread2:loop time about 50ms-100ms 
    sched_yield(); 
    } 
} 
void* thread3(void *){ 
    while(1){ 
    //code for thread3 
    sched_yield(); 
    } 
} 
int main(){ 
    pthread_t t1,t2,t3; 
    pthread_create(&t1,NULL,thread1,NULL); 
    pthread_create(&t2,NULL,thread2,NULL); 
    pthread_create(&t3,NULL,thread3,NULL); 

    pthread_join(t1,NULL); 
    pthread_join(t2,NULL); 
    pthread_join(t3,NULL); 

    return 0; 
} 
+1

T3가 (최대한 가깝게) T1과 T2를 즉시 선점하고 항복 할 때까지 실행하고 싶습니다. T3에 더 높은 우선 순위를 부여하려는 것 같습니다. 그러나 동기화를 위해 이것을 믿지 마십시오. – user4581301

+1

"인터럽트"가 의미하는 것을 정의하십시오. 이 용어는이 문맥에서 많은 다른 의미를 가지고 있습니다. 게다가,'sched_yield()'는 실제로 어떤 일이 일어날 지 보장하지 않는다는 것을 이해합니다. XY 문제처럼 들립니다. 당신의 진정한 문제는 다른 것인데 당신은 해결책이이 질문이 묘사 한 것이라고 생각합니다. 어쩌면 당신이 진짜 문제를 기술한다면 누군가 당신을위한 진정한 해결책을 제시 할 수 있습니다. –

+0

@ user4581301 예. 이 경우 현재 실행중인 스레드 (t1 및 t2)가 여전히 실행 중이며 리소스를 포기하지 않으므로 우선 순위가 작동해서는 안됩니다. – user9870

답변

1

는) 당신은 (usleep 호출 루프에서 T3 실행을 할 수 있습니다)가 일정 시간 동안 잠자기 상태로 돌아 왔을 때 usleep()이 돌아 오면 T3는 usleep()을 다시 호출하기 전에 유용한 일을 할 수 있습니다. 영리 해지려면 T3가 usleep) 유용한 (유용하게) 30mS (평균)에 한 번 가까이 발생하기 때문에, T3가 드리프트 보정을 위해 사용 된 (유용한) 일을 처리하는 시간을 보충하십시오.

그러나, T3의 동작이 T1 및 T2 실행 방법/시간을 어떻게 든 제어 할 것으로 기대하고 있습니다. e, 당신은 실망하게 될 것입니다. 스레드는 기본적으로 서로 비동기 적으로 (그리고 예기치 않게) 비동기 적으로 실행되며, T3가 주어진 순간에 실행되고 있다고해서 T1과 T2도 같은 순간에 실행되지는 않습니다 (멀티 코어/멀티 프로세서 생각).

스레드의 실행을 동기화하려는 경우 뮤텍스 또는 조건 변수와 같은 적절한 스레드 동기화 메커니즘을 사용해야합니다. 대체할만한 것이 없습니다. :)