पर अप्रत्याशित परिणाम मैंने सैमफोरों का उपयोग करके पाठकों-लेखकों की समस्या को हल करने के लिए एक सरल कार्यक्रम लिखा था। यह लिनक्स ओएस पर पूरी तरह से चलता है, लेकिन जब मैं इसे अपने मैक ओएसएक्स पर चलाता हूं तो मुझे अप्रत्याशित परिणाम मिलते हैं और मैं यह नहीं समझ सकता कि क्यों।सेमफोरस का उपयोग करने वाला प्रोग्राम लिनक्स पर ठीक चलता है ... मैक ओएसएक्स
मेरे कार्यक्रम:
#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);
}
}
उत्पादन मैं लिनक्स पर प्राप्त (क्या यह अपेक्षा की जाती है की तरह लग रहे करने के लिए):
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
...
मैक OSX (अप्रत्याशित) पर उत्पादन:
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
...
नहीं एक समाधान है, लेकिन कभी भी एक बहु लड़ी प्रणाली एक ही स्थान में ठीक काम करता है (और आप लिनक्स? के विभिन्न धारणाओं की कोशिश की है), लेकिन किसी अन्य स्थान तो मैं एक रेस स्थिति पर शक किया जाएगा में ठीक नहीं। –