我想在共享內存中使用指針編譯代碼。我想使用互斥變量來檢查進程間同步是否可能。但是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的評論。 – wilsonmichaelpatrick
我已經刪除了我以前的答案,但爲什麼要將shm_addr轉換爲pthread_mutex?你應該創建一個單獨的pthread_mutex並初始化它,這與共享內存地址不同。 'pthread_mutex_t myMutex; pthread_mutex_init(&myMutex,0);的pthread_mutex_lock(&myMutex);等等......'你鎖定了互斥鎖,而不是內存指針本身,並且在鎖定互斥鎖的同時完成你的工作。如果每個線程在訪問內存之前使用互斥鎖,則它是互斥訪問。 (它不像你在對象本身上同步的Java。) – wilsonmichaelpatrick
另見http://stackoverflow.com/questions/2584678/how-do-i-synchronize-access-to-shared-memory-in-lynxos-posix – wilsonmichaelpatrick