Page 126 - 4868
P. 126
Ошибка! Стиль не определен. 124
#include <stdio.h>
#define SHARED 1
#define MAXSIZE 2000 /* максимальний розмір матриці */
#define MAXWORKERS 4 /* максимальне число робочих потоків */
pthread_mutex_t barrier; /* блокування для бар’єру */
pthread_cond_t go; /* умовна змінна */
int numWorkers; /* число робочих потоків */
int numArrived = 0; /* кількість потоків, */
/*що підійшли до бар’єру */
/* повторно використовуваний бар’єр-лічильник */
void Barrier() {
pthread_mutex_lock(&barrier);
numArrived++;
if (numArrived < numWorkers)
pthread_cond_wait(&go, &barrier);
else {
numArrived = 0; /* останній робочий потік */
/*запускає інші потоки*/
pthread_cond_broadcast(&go);
}
pthread_mutex_unlock(&barrier);
}
void* Worker (void*);
int size, stripSize; /* size == stripSize * numWorkers */
int sums[MAXWORKERS]; /* cуми, обчислені кожним потоком */
int matrix[MAXSIZE][MAXSIZE];
/* зчитати командний рядок та створити потоки */
int main(int argc, char* argv[]) {
int i, j;
pthread_attr_t attr;
pthread_t workerid[MAXWORKERS];
/* встановити глобальні атрибути потоку */
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
/* ініціалізувати м’ютекс та умовну змінну */
pthread_mutex_init(&barrier, NULL);
pthread_cond_init(&go, NULL);
/* зчитати командний рядок */
size = atoi(argv[1]);
numWorkers = atoi(argv[2]);
stripSize = size/numWorkers;
/* ініціалізувати матрицю */
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
matrix[i][j] = 1;