Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用信号量的一些问题_C_Synchronization_Semaphore - Fatal编程技术网

C 使用信号量的一些问题

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_

现在我正在做我的项目,我有一个关于信号量初始化的问题。实际上我是在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_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