2012-03-02 4 views
0

У меня есть процесс с 2 нити, которые работают как этотнить

thread1

while(true){ 
    Time t = getTime(); 
    Notify/wakeup Thread2 after time 't' 

    .... 
    .... 
} 

thread2

while(true) { 
    wait for a signal from Thread1 

    do some stuff 
} 

Есть ли способ достичь этого сценария?

Если getTime() возвращает 5 единиц (абсолютное время) времени, то Thread2 должен начать выполнение через 5 единиц времени.

PS: Я использую библиотеку Pthread, готовую использовать и другую библиотеку.

Благодаря

+0

Если GetTime() возвращает мс с 1970 года, что означает «после времени t»? Блокирует ли какое-то условие? –

+0

'getTime()' return абсолютное время (может быть ms или секунда) не относительно определенного года –

+0

Я удалил 'some condition', чтобы избежать путаницы. –

ответ

0

Использование комбинации usleep, условных переменных, а переменная состояния:

pthread_cond_t cond; 
pthread_mutex_t mutex; 
int state = 0; 

clock_t start, stop;  
while(true){ 
    Time t = getTime(); 
    start = clock(); 
    // do some action 
    stop = clock(); 

    if((stop - start) < t) 
     usleep(t - (stop - start)); 

    pthread_mutex_lock(&mutex) 
    state++; 
    pthread_cond_signal(&cond); 
    pthread_mutex_unlock(mutex); 
} 

Затем в поток 2:

while(true) { 
    pthread_mutex_lock(&mutex); 
    int st = state; 
    while(state == st) 
     pthread_cond_wait(&cond, &mutex); 
    pthread_mutex_unlock(&mutex); 

    do some stuff 
} 
+0

это может быть способ решить, но я не хочу, чтобы Thread1 спал, потому что у него есть что-то другое. –

+0

Итак, вы хотите что-то вроде: thread1 запускает, делает какое-то действие, но если t миллисекунды не истекли в конце действия, подождите, пока t не истечет, а затем сообщите thread2, правильно? Проверьте, выполнено ли редактирование. – Tudor

+0

@ Давид Шварц: Спасибо. – Tudor

Смежные вопросы