【发布时间】:2013-05-25 13:16:09
【问题描述】:
我正在尝试使用共享内存中的指针编译代码。我想使用 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;
}
我不知道为什么。有人可以帮忙吗?
谢谢。
【问题讨论】:
-
一旦你得到这个编译,我希望你在做的事情上会有其他问题。请参阅 Jens Gustedt @JensGustedt 下面的 cmets。
-
我已经删除了我之前的答案,但你为什么要将 shm_addr 转换为 pthread_mutex?您应该创建一个单独的 pthread_mutex 并对其进行初始化,它与共享内存地址不同。
pthread_mutex_t myMutex; pthread_mutex_init(&myMutex, 0); pthread_mutex_lock(&myMutex); etc...您锁定了互斥体,而不是内存指针本身,并在互斥体被锁定时执行您的工作。如果每个线程在访问内存之前都使用了互斥锁,那么它就是互斥访问。 (它不像 Java 那样在对象本身上进行同步。) -
您看到我对您删除的答案的评论了吗?这是我的评论:六个进程将使用共享内存。一个进程只读取共享内存,另外 5 个进程只写入。将值写入共享内存并读取共享内存中的值可能存在竞争条件问题。所以,我决定使用共享内存的一部分作为互斥变量。在共享内存中写入和读取值之前,我已经预料到了声明
pthread_mutex_lock((pthread_mutex_t*)shm_addr)。声明pthread_mutex_unlock((pthread_mutex_t*)shm_addr) -
在共享内存中写入和读取值后。;
标签: c pthreads shared-memory