include pthread include stdio int sum0 sum1 sum2 сумма элементов каждо

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#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;
}