1

我正在尝试使用共享内存中的指针编译代码。我想使用 mutex 变量来检查是否可以进行进程间同步。但是 Xcode 给了我错误“解析问题”预期表达式“并
*(pthread_mutex_t*)shm_addr = PTHREAD_MUTEX_INITIALIZER;以红色突出显示该行。
这是代码。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define KEY_NUM 9527
#define MEM_SIZE 4096

pthread_mutex_t test;
int main(int argc, char * argv[])
{
    int     shm_id;
    void    *shm_addr;

    if( (shm_id = shmget((key_t)KEY_NUM, MEM_SIZE, IPC_CREAT | 0666)) == -1)
    {
        printf("fail to allocate a shared memory.\n");
        return -1;
    }

    if((shm_addr = shmat(shm_id, (void*)0,0)) == (void*)-1)
    {
        printf("fail to attach shared memory.\n");
        return -1;
    }

    *(pthread_mutex_t*)shm_addr     = PTHREAD_MUTEX_INITIALIZER; // error.


    test                            = PTHREAD_MUTEX_INITIALIZER; 
    // this statement works well.
    *(int*)(shm_addr+64) = 10000; // this statement also works well.

    // information useful to you.
    // sizeof(pthread_mutex_t*) : 64
    // OS X Mountain Lion 64bits
    return 0;
}

我不知道为什么。任何人都可以帮忙吗?

谢谢你。

4

1 回答 1

1

要在共享内存中使用互斥锁,您首先需要一个支持此功能的系统(您没有告诉我们),然后您必须相应地初始化互斥锁。宏PTHREAD_MUTEX_INITIALIZER不适用于此,您必须使用pthread_mutex_init正确的参数集动态使用。

与此相关的文本始终是 POSIX 标准,您可以通过搜索name_of_the_function_you_are_interested_in和“opengroup”轻松找到该标准。在这里pthread_mutex_init它说:

在默认互斥体属性合适的情况下,宏 PTHREAD_MUTEX_INITIALIZER可用于初始化 静态分配的互斥体。其效果应等同于通过调用pthread_mutex_init()参数 attr 指定为 NULL 进行动态初始化,但不执行错误检查。

而该功能的相关部分pthread_mutexattr_setpshared指出:

process-shared 属性设置为 PTHREAD_PROCESS_SHARED 以允许任何有权访问分配互斥锁的内存的线程对互斥锁进行操作,即使互斥锁是在由多个进程共享的内存中分配的。如果进程共享属性是 PTHREAD_PROCESS_PRIVATE,则互斥锁只能由与初始化互斥锁的线程在同一进程中创建的线程操作;如果不同进程的线程试图对这样的互斥体进行操作,则行为未定义。该属性的默认值应为 PTHREAD_PROCESS_PRIVATE

此外,在现代系统和新代码上,不要使用古老的shmat调用。对此的现代替代品是shm_open和的组合mmap

于 2013-05-25T14:52:02.493 回答