2010-10-18 5 views
1

У меня есть несколько потоков, и я хочу, чтобы каждый поток ждать каждый друг, чтобы завершить в определенный момент в коде, прежде чем продолжить следующим образом:POSIX синхронизация потоков остановка на тот же код

void *run() { 
    for (i=0;i<1000;i++){ 
    do_1st(); 
    // sync() all stop here wait for all then resume 
    do_2nd(); 
    } 
} 

Я пытался использовать pthread_cond_wait .. но кажется очень сложным.

Есть ли какие-либо легкие ожидания для этого?

Спасибо

+0

барьер ответ правильный, но вы можете также рассмотреть возможность использования подталкивания оберток для простоты в использовании. –

ответ

5

Вы можете использовать pthread_barrier, инициализировать его, прежде чем начать свои темы, и установите count на нет. потоков, которые запускают ваш цикл. например если у вас есть 8 потоков:

pthread_barrier_init(&my_barrier,NULL,8); 

Петля нить теперь становится

void *run() { 
    for (i=0;i<1000;i++){ 
    do_1st(); 
    pthread_barrier_wait(&my_barrier); 
    do_2nd(); 
    } 
} 
+0

это именно то, что мне нужно! thx nos. Кстати, мне нужно уничтожить барьер после использования? – w00d

+0

Вы должны, да, хотя, если вы выполняете свои потоки несколькими партиями, вы можете его повторно использовать. Если ваше приложение выйдет, когда закончите с этими расчетами, оно будет очищено при завершении процесса. – nos

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