使用共享内存会遇到麻烦

时间:2013-05-25 13:16:09

标签: c pthreads shared-memory

我正在尝试使用共享内存中的指针编译代码。我想使用互斥变量来检查是否可以进行进程间同步。但是Xcode给了我错误“Parse Issue”Expected Expression“并突出显示了行 红色*(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;
}

我不知道为什么。有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

  

如果默认互斥锁属性合适,则为宏   PTHREAD_MUTEX_INITIALIZER可用于初始化互斥锁   分配静态。效果应相当于动态   通过使用参数attr调用pthread_mutex_init()进行初始化   指定为NULL,但不执行错误检查。

而函数pthread_mutexattr_setpshared的相关部分指出:

  

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

此外,在现代系统和新代码中,请勿使用古老的shmat调用。现代替代品是shm_openmmap的组合。