синхронизация потоков - PullRequest
0 голосов
/ 02 марта 2012

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

Резьба1

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

    ....
    ....
}

Резьба2

while( true ) {
     wait for a signal from Thread1

     do some stuff 
}

Есть ли способ реализовать этот сценарий?

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

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

Спасибо

1 Ответ

0 голосов
/ 02 марта 2012

Используйте комбинацию 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 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...