Я пытаюсь скомпилировать код, используя указатель в общей памяти. Я хотел бы использовать переменную mutex, чтобы проверить, возможна ли межпроцессная синхронизация. Но Xcode дает мне ошибку «Анализировать Issue„Ожидаемое Экспрессия“и выдвигает на первый план линию
*(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); etc ... 'Вы блокируете мьютекс, а не указатель памяти, и выполняете свою работу, пока мьютекс заблокирован. Если каждый поток использует мьютекс перед доступом к памяти, то это взаимно эксклюзивный доступ. (Это не похоже на Java, где вы синхронизируете сам объект.) – wilsonmichaelpatrick
Также см. Http://stackoverflow.com/questions/2584678/how-do-i-synchronize-access-to-shared-memory-in-lynxos-posix – wilsonmichaelpatrick