C 使用信号量的一些问题
现在我正在做我的项目,我有一个关于信号量初始化的问题。实际上我是在MacOSX上编程的,但我试着在Linux上编译我的项目,但它没有编译。在OSX上,它可以编译,但每次初始化时都会崩溃C 使用信号量的一些问题,c,synchronization,semaphore,C,Synchronization,Semaphore,现在我正在做我的项目,我有一个关于信号量初始化的问题。实际上我是在MacOSX上编程的,但我试着在Linux上编译我的项目,但它没有编译。在OSX上,它可以编译,但每次初始化时都会崩溃 sem_t *mutex_1, *mutex_2, *mutex_3, *reader, *writer; int initialization_semaphores (void) { int ERROR = EOK; if ((mutex_1 = mmap(NULL, sizeof(sem_
sem_t *mutex_1, *mutex_2, *mutex_3, *reader, *writer;
int initialization_semaphores (void)
{
int ERROR = EOK;
if ((mutex_1 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((mutex_2 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((mutex_3 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((reader = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((writer = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if (ERROR == EOK) {
if (sem_init(mutex_1, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(mutex_2, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(mutex_3, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(reader, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(writer, 1, 1) == -1)
ERROR = ESEM;
}
}
当我尝试在linux上编译它时,我看到:
/tmp/ccmkN9G7.o: In function `initialization_semaphores':
readerWriter.c:(.text+0x1a2): undefined reference to `sem_init'
readerWriter.c:(.text+0x1cb): undefined reference to `sem_init'
readerWriter.c:(.text+0x1f4): undefined reference to `sem_init'
readerWriter.c:(.text+0x21d): undefined reference to `sem_init'
readerWriter.c:(.text+0x246): undefined reference to `sem_init'
readerWriter.c:(.text+0x275): undefined reference to `shm_open'
是这样吗
int ERROR = EOK;
mutex_1 = sem_open("mutex1", O_CREAT, S_IRUSR | S_IWUSR, 1);
mutex_2 = sem_open("mutex2", O_CREAT, S_IRUSR | S_IWUSR, 1);
mutex_3 = sem_open("mutex3", O_CREAT, S_IRUSR | S_IWUSR, 1);
reader = sem_open("reader", O_CREAT, S_IRUSR | S_IWUSR, 1);
writer = sem_open("writer", O_CREAT, S_IRUSR | S_IWUSR, 1);
Mac OSX不一致,不支持
sem\u init
。该函数存在,但它会无声地失败或更糟,给您留下一个不工作的信号量
我鼓励您向苹果公司提交一个bug,因为这是一个真正的、长期存在的问题,严重影响了应用程序的可移植性。抱怨的人越多,修理它的希望就越大
至于解决这个问题,您可以尝试找到/编写所有POSIX信号量函数的替换实现,并将您的程序链接到该实现,或者您可以切换到使用sem_open
而不是mmap
和sem_init
(只要你已经经历了为每个信号量映射整个页面的开销,
sem\u open
就不会花费你更多的钱。当你想将信号量包含在现有的结构中时,这个错误才是真正的障碍)Mac OSX上有一个解决方法
#include <dispatch/dispatch.h>
typedef dispatch_semaphore_t sem_t;
void sem_init(sem_t* sem, bool is_pshared, unsigned value)
{
*sem = dispatch_semaphore_create(value);
}
static void sem_destroy(sem_t* sem)
{
dispatch_release(*sem);
}
static void sem_post(sem_t* sem)
{
dispatch_semaphore_signal(*sem);
}
static void sem_wait(sem_t* sem)
{
dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER);
}
#包括
类型定义调度信号量;
void sem_init(sem_t*sem,bool是共享的,无符号值)
{
*sem=调度信号量创建(值);
}
静态孔隙sem_破坏(sem_t*sem)
{
调度发布(*sem);
}
静态孔隙sem_柱(sem_t*sem)
{
调度信号量信号(*sem);
}
静态空隙sem_wait(sem_t*sem)
{
调度信号灯等待(*sem,调度时间永远);
}
但是,我不知道如何执行sem_getvalue()
——如果有人知道,请告诉我。我注意到,即使函数声明返回int
,您也不会从函数中返回值。这应该引起一个警告——它是否引起了其他可能有用的警告?(尽管R..总是正确的,但在错误或警告中可能仍然有启发性的地方。)我从函数返回了值,实际上我没有将我的所有函数都粘贴到这里。顺便说一句,错误和警告几乎不可能在注释中读取;对这篇文章进行评论可能会更好。:)在Linux上,您可能需要-lpthread
和/或-lrt
。是的,我知道这一点,但它不起作用,我无法初始化信号量。每次我得到错误=ESEM