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