2013-05-25 3 views
0

Я пытаюсь скомпилировать код, используя указатель в общей памяти. Я хотел бы использовать переменную 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; 
} 

Я понятия не имею, почему. Может кто-нибудь помочь?

.

+0

Как только вы получите это для компиляции, я ожидаю, что у вас будут другие проблемы с тем, что вы делаете. См. Комментарии ниже Jens Gustedt @ JensGustedt. – wilsonmichaelpatrick

+0

Я удалил свой предыдущий ответ, но почему вы бросаете shm_addr в pthread_mutex? Вы должны создать отдельный pthread_mutex и инициализировать его, это другое дело, чем адрес общей памяти. 'pthread_mutex_t myMutex; pthread_mutex_init (& myMutex, 0); pthread_mutex_lock (& ​​myMutex); etc ... 'Вы блокируете мьютекс, а не указатель памяти, и выполняете свою работу, пока мьютекс заблокирован. Если каждый поток использует мьютекс перед доступом к памяти, то это взаимно эксклюзивный доступ. (Это не похоже на Java, где вы синхронизируете сам объект.) – wilsonmichaelpatrick

+0

Также см. Http://stackoverflow.com/questions/2584678/how-do-i-synchronize-access-to-shared-memory-in-lynxos-posix – wilsonmichaelpatrick

ответ

1

Чтобы использовать мьютексы в общей памяти, вам прежде всего нужна система, которая поддерживает это (вы не сказали нам), а затем вам нужно будет инициализировать мьютексы соответственно. Макрос PTHREAD_MUTEX_INITIALIZER не подходит для t его, вам придется динамически использовать 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:

Атрибут процесс с разделением установлен на PTHREAD_PROCESS_SHARED в разрешить мьютекс, чтобы работать на любой поток, который имеет доступ к памяти где выделяется мьютекс, даже если мьютекс равен , выделенному в памяти, который разделяется несколькими процессами. Если связанный с процессом атрибут является PTHREAD_PROCESS_PRIVATE, то мьютекс должен использовать только потоки, созданные в том же процессе, что и , поток, инициализирующий мьютекс; если потоки различающихся процессов пытаются работать с таким мьютексом, поведение не определено. Значение по умолчанию для атрибута должно быть PTHREAD_PROCESS_PRIVATE.

Кроме того, на современных системах и с новым кодом не используйте древние звонки shmat. Современной заменой для этого является комбинация shm_open и mmap.

+0

Не могли бы вы объяснить, почему «tempMutex» в вышеуказанном коде более не может использоваться в общей памяти? ИЛИ любая страница была бы потрясающей. Кроме того, я прокомментировал, какую программу я пишу выше. – inherithandle

Смежные вопросы