Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 42



, передается в параметре count.

После того как барьер создан, каждый из потоков должен будет вызвать функцию barrier_wait(), чтобы сообщить, что он отработал:

>#include


>int barrier_wait(barrier_t *barrier);

После того как поток вызвал barrier_wait(), он будет блокирован до тех пор, пока число потоков, указанное первоначально в параметре count функции barrier_init(), не вызовет функцию barrier_wait() (они также будут блокированы). После того как нужное число потоков выполнит вызов функции barrier_wait(), все эти потоки будут разблокированы «одновременно».

Вот пример:

>/*

>* barrier1.c

>*/


>#include

>#include

>#include

>#include


>barrier_t barrier; // Объект типа «барьер»


>void* thread1(void *not_used) {

> time_t now;

> char buf[27];

> time(&now);

> printf("Поток 1, время старта %s", ctime_r(&now, buf));


> // Выполнить вычисления

> // (вместо этого просто сделаем sleep)

> sleep(20);


> barrier_wait(&barrier);


> // После этого момента все потоки уже завершатся

> time(&now);

> printf("Барьер в потоке 1, время срабатывания %s",

>  ctime_r(&now, buf));

>}


>void* thread2(void *not_used) {

> time_t now;

> char buf[27];

> time(&now);

> printf("Поток 2, время старта %s", ctime_r(&now, buf));


> // Выполнить вычисления

> // (вместо этого просто сделаем sleep)

> sleep(40);


> barrier_wait(&barrier);


> // После этого момента все потоки уже завершатся

> time(&now);

> printf("Барьер в потоке 2, время срабатывания %s",

>  ctime_r(&now, buf));

>}


>main() // Игнорировать аргументы

>{

> time_t now;

> char buf[27];


> // Создать барьер со значением счетчика 3

> barrier_init(&barrier, NULL, 3);

> // Создать два потока, thread1 и thread2

> pthread_create(NULL, NULL, thread1, NULL);

> pthread_create(NULL, NULL, thread2, NULL);


> // Сейчас выполняются оба потока

> // Ждать завершения

> time(&now);

> printf("main(): ожидание у барьера, время %s",

>  ctime_r(&now, buf));


> barrier_wait(&barrier);


> // После этого момента все потоки уже завершатся

> time(&now);

> printf("Барьер в main(), время срабатывания %s",

>  ctime_r(&now, buf));

>}

Основной поток создал объект типа «барьер» и инициализировал его значением счетчика, равным числу потоков (включая себя!), которые должны «встретиться» у барьера, прежде чем он «прорвется». В нашем примере этот индекс был равен 3 — один для потока main(), один для потока thread1() и один для потока thread2(). Затем, как и прежде, стартуют потоки вычисления графики (в нашем случае это потоки thread1() и thread2()). Для примера вместо приведения реальных алгоритмов графических вычислений мы просто временно «усыпили» потоки, указав в них