Saya mencoba menulis beberapa contoh threading dengan C. Yang merupakan nomor yang didapat dari pengguna dan jumlah nomor dalam dua thread.
Benangnya berjauhan satu sama lain, depan ke belakang dan belakang ke depan.
Saya menggunakan semaphore untuk mengelola variabel global tetapi keluaran menunjukkan bahwa semaphore tidak berfungsi dengan benar.
Apa yang salah?
Keluaran kode:
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.
Kode :
#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);
}