2013-05-25 48 views
0

我想在共享內存中使用指針編譯代碼。我想使用互斥變量來檢查進程間同步是否可能。但是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; 
} 

我不知道爲什麼。誰能幫助?

謝謝

+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);等等......'你鎖定了互斥鎖,而不是內存指針本身,並且在鎖定互斥鎖的同時完成你的工作。如果每個線程在訪問內存之前使用互斥鎖,則它是互斥訪問。 (它不像你在對象本身上同步的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_openmmap的組合。

+0

您能否解釋爲什麼上面的代碼中的'tempMutex'不能在共享內存中更詳細地使用?或者任何頁面都很棒。另外,我已經評論了我在上面的答案上寫了什麼程序。 – inherithandle