#include #include int sum0 = 0, sum1 = 0, sum2 = 0; pthread_t thread[2]; pthread_barrier_t barr; int randNum(int from, int to) { return from + (rand() % (to - from + 1)); } void *func(void* p) { int arr[5]; int num = (int)(p); if (num == 0) { for (int i = 0; i < 5; i++) arr[i] = randNum(0, 10); //i + 1; //{1, 2, 3, 4, 5}; } if (num == 1) { for (int i = 0; i < 5; i++) arr[i] = randNum(0, 10); //i + 3; //{3, 4, 5, 6, 7}; } if (num == 2) { for (int i = 0; i < 5; i++) arr[i] = randNum(0, 10); //i + 5; //{5, 6, 7, 8, 9}; } for (int i = 0; i < 5; i++) { if (num == 0) { sum0 += arr[i]; } if (num == 1) { sum1 += arr[i]; } if (num == 2) { sum2 += arr[i]; } } if (num == 0) printf("Имеем №1 %d \n", sum0); if (num == 1) printf("Имеем №2 %d \n", sum1); if (num == 2) printf("Имеем №3 %d \n", sum2); while (sum0 != sum1 || sum1 != sum2) { pthread_barrier_wait(&barr); if (num == 0) { if (sum0 > sum1) { sum0--; arr[0]--; } if (sum0 < sum1) { sum0++; arr[0]++; } } if (num == 2) { if (sum2 > sum1) { sum2--; arr[2]--; } if (sum2 < sum1) { sum2++; arr[2]++; } } if (num == 1) { if (sum1 > sum0 || sum1 < sum0 || sum1 > sum2 || sum1 < sum2) { int r = randNum(0, 1); if (r == 0) { sum1++; arr[1]++; } else { sum1--; arr[1]--; } } } pthread_barrier_wait(&barr); if (num == 0) printf("Поменяли №1 %d \n", sum0); if (num == 1) printf("Поменяли №2 %d \n", sum1); if (num == 2) printf("Поменяли №3 %d \n", sum2); pthread_barrier_wait(&barr); } pthread_barrier_wait(&barr); if (num == 0) printf("Результат №1 %d \n", sum0); if (num == 1) printf("Результат №2 %d \n", sum1); if (num == 2) printf("Результат №3 %d \n", sum2); pthread_barrier_wait(&barr); return NULL; } int main() { pthread_barrier_init(&barr, NULL, 3); pthread_create(&thread[0], NULL, func, (void *)0); pthread_create(&thread[1], NULL, func, (void *)1); func((void*)2); return 0; }