Page 159 - 6571
P. 159

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;
                    /* створити робочі потоки і вийти з головного потоку
            */
                    for (i = 0; i < numWorkers; i++)
                      pthread_create(&workerid[i], &attr, Worker, (void*)
            i);

                    pthread_exit(NULL);
                  }
                  /* кожен робочий потік підсумовує значення одного рядка
            */
                  /* після бар’єру потік worker(0) виводить загальну суму
            */
                  void* Worker(void* arg) {
                    int myid = (int) arg;
                    int total, i, j, first, last;
                    /* визначити перший та останній рядок */
                    first = myid * stripSize;
                    last = first + stripSize-1;
                    /* просумувати значення в рядку */
                    total = 0;
                    for (i = first; i <= last; i++)
                    for (j = 0; j < size; j++)
                    total += matrix[i][j];


                                                        158
   154   155   156   157   158   159   160   161   162   163   164