我编写了一个使用信号量解决读写器问题的简单程序.它在 Linux 操作系统上完美运行,但是当我在我的 Mac osX 上运行它时,我得到了意想不到的结果,我不知道为什么.
I wrote a simple program solving the Readers-Writers problem using semaphores. It runs perfectly on Linux os, but when I run it on my Mac osX I get unexpected results and I can't figure out why.
我的程序:
#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
", X);
sem_post(&s1); // signal
sem_wait(&s2); // wait
printf("After thread ID A reads from Y, Y = %d
", Y); // read
sleep(3);
}
}
void* function2(void* val)
{
while(1)
{
sem_wait(&s1); // wait
printf("After thread ID B reads from X, X = %d
", X); // read
Y = rand()%1000; // write
printf("After thread ID B write to Y, Y = %d
", Y);
sem_post(&s2); // signal
sleep(3);
}
}
我在 Linux 上收到的输出(应该是什么样子):
The output I receive on Linux (what it's supposed to look like):
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
...
Mac osX 上的输出(意外):
The output on Mac osX (unexpected):
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
...
推荐答案
检查 sem_init 调用的错误返回;我敢打赌,您会发现 OS X 版本返回功能未实现"错误.
Check the error return on the sem_init calls; I bet you'll find the OS X version returning a "Function not implemented" error.
这是因为 未命名的 POSIX 信号量未在 OS X 上实现.您需要使用命名信号量或 pthread 互斥/条件变量.
This is because unnamed POSIX semaphores are not implemented on OS X. You need to use named semaphores, or pthread mutex/condition variables.
相关推荐
最新文章