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;
   121   122   123   124   125   126   127   128   129   130   131