#include <pthread.h>
#include <stdio.h>
int sum0 = 0, sum1 = 0, sum2 = 0; //сумма элементов каждого массива
pthread_t thread[2];
pthread_barrier_t barr; // объявляет барьер
/*
* функция генерирует случайное число в заданном диапазоне
* from - первый элемент диапазона
* to - последний элемент
*/
int randNum(int from, int to)
{
return from + (rand() % (to - from + 1));
}
/*
* Каждый поток в функции func будет иметь свой массив, заполненный случайными символами
* arr - массив
* num - номер потока
*
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);
}
if (num == 1) { // заполняем массив второго потока случайными числами
for (int i = 0; i < 5; i++)
arr[i] = randNum(0, 10);
}
if (num == 2) { // заполняем массив третьего потока случайными числами
for (int i = 0; i < 5; i++)
arr[i] = randNum(0, 10);
}
// ищем сумму массивов каждого потока
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;
}