J'ai écrit un programme simple résoudre le problème des lecteurs-écrivains en utilisant des sémaphores. Il fonctionne parfaitement sur OS Linux, mais quand je l'exécute sur mon OSX Mac, j'obtiens des résultats inattendus et je n'arrive pas à comprendre pourquoi.Programme utilisant Semaphores s'exécute bien sur Linux ... résultats inattendus sur Mac OSX
Mon programme:
#include <semaphore.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* function1(void* val);
void* function2(void* val);
// shared values
volatile int X;
volatile int Y;
// declare semaphores
sem_t s1;
sem_t s2;
main()
{
void* status;
pthread_t thread1;
pthread_t thread2;
srand(time(NULL));
// initialize semaphores to zero
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);
pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);
pthread_join(thread1, &status);
pthread_join(thread2, &status);
sem_destroy(&s1);
sem_destroy(&s2);
}
void* function1(void* val)
{
while(1)
{
X = rand()%1000; // write
printf("After thread ID A writes to X, X = %d\n", X);
sem_post(&s1); // signal
sem_wait(&s2); // wait
printf("After thread ID A reads from Y, Y = %d\n", Y); // read
sleep(3);
}
}
void* function2(void* val)
{
while(1)
{
sem_wait(&s1); // wait
printf("After thread ID B reads from X, X = %d\n", X); // read
Y = rand()%1000; // write
printf("After thread ID B write to Y, Y = %d\n", Y);
sem_post(&s2); // signal
sleep(3);
}
}
La sortie que je reçois sur Linux (ce qu'il est censé ressembler):
After thread ID A writes to X, X = 100
After thread ID B reads from X, X = 100
After thread ID B write to Y, Y = 234
After thread ID A reads from Y, Y = 234
...
La sortie sur Mac OS X (inattendu):
After thread ID A writes to X, X = 253
After thread ID A reads from Y, Y = 0
After thread ID B reads from X, X = 253
After thread ID B write to Y, Y = 728
...
Pas une solution, mais à chaque fois qu'un système multithread fonctionne très bien dans un seul endroit (et avez-vous essayé différentes obédiences de Linux?), Mais pas bien dans un autre endroit alors je serais soupçonnais une condition de course. –