Я пытаюсь написать пример с несколькими потоками с помощью C. Это число получает от пользователя и суммирует числа в двух потоках.
Нити находятся непосредственно друг напротив друга, спереди назад и сзади наперед.
Я использую семафор для управления глобальными переменными, но вывод показывает, что семафор работает неправильно.
Что не так?
Вывод кода:
Array size? :10
Array of contents? :4 2 8 1 5 3 7 9 6 10
Thread_1 > read 4, sum is = 4
Thread_1 > read 2, sum is = 6
Thread_1 > read 8, sum is = 14
Thread_1 > read 1, sum is = 15
Thread_1 > read 5, sum is = 20
Thread_1 > read 3, sum is = 23
Thread_1 > read 7, sum is = 30
Thread_1 > read 9, sum is = 39
Thread_1 > read 6, sum is = 45
Thread_1 > read 10, sum is = 55
Thread_1 > End.
Thread_2 > End.
Код :
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
int *array; //Global integer array
int sum; //Global sum variable
int counter = 0;
sem_t mutex;
void *front_to_back( void *val )
{
int SIZE;
SIZE = *((int *) val);
while (1)
{
sem_wait(&mutex);
if( counter != SIZE )
{
sum = sum + array[counter];
printf("Thread_1 > read %d, sum is = %d \n", array[counter], sum);
counter++;
}else
{
printf("Thread_1 > End. \n");
sem_post(&mutex);
break;
}
sem_post(&mutex);
}
}
void *back_to_front( void *val )
{
int SIZE;
SIZE = *((int *) val);
int i=1;
while (1)
{
sem_wait(&mutex);
if( counter != SIZE )
{
sum = sum + array[SIZE - i];
printf("Thread_2 > read %d, sum is = %d \n", array[SIZE - i], sum);
counter++;
i++;
}else
{
printf("Thread_2 > End. \n");
sem_post(&mutex);
break;
}
sem_post(&mutex);
}
}
main(){
int SIZE;
printf("Array size? :");
scanf("%d", &SIZE);
array = malloc(SIZE*sizeof(int));
int i=0;
printf("Array of contents? :");
for (i ; i<SIZE ; i++)
{
scanf("%d", &array[i]);
}
pthread_t t[2];
sem_init(&mutex, 0, 1);
pthread_create(&t[1], NULL, front_to_back, (void *) &SIZE );
pthread_create(&t[2], NULL, back_to_front, (void *) &SIZE );
pthread_join(t[1],NULL);
pthread_join(t[2],NULL);
free(array);
sem_destroy(&mutex);
}