2017-03-06 75 views
1

關於如果可以在進程之間共享pthread互斥體的stackoverflow有很多問題,但是我沒有發現有關共享互斥體初始化的問題/回答。正確使用正在進程之間共享的pthread互斥體

據我所知,使用進程共享互斥的常見方式如下:分配一塊共享內存,在共享內存塊上初始化一個pthread互斥量,使用它。

在共享內存創建的情況下,如果多個進程嘗試使用相同的密鑰ID分配共享內存塊,則由OS處理。好的,但我不明白的是,如何安全地初始化共享內存塊上的互斥鎖?

我說得對,pthread_mutex_init沒有提供任何安全的方法來同時從不同的進程初始化pthread_mutex_t?如果是的話,我如何爲流程初始化共享的「互斥」提供獨佔訪問?如何確保另一個進程是否成功初始化互斥鎖?

第二個問題涉及阻塞互斥體的進程崩潰的情況。好的,有一個強大的互斥體可以處理這種情況並返回相應的錯誤代碼。共享內存塊呢?看起來像一個進程應該關心它是否是使用共享內存摧毀它的最後一個進程。

+0

出於好奇,爲什麼不使用POSIX信號量呢? http://man7.org/linux/man-pages/man7/sem_overview.7.html與pthread_mutex不同,POSIX信號量用於進程間通信。 –

+0

@jameslarge這是一個很好的問題。有些人建議使用互斥鎖而不是信號量。例如,http://stackoverflow.com/q/6477525/465662我試圖找到任何真正的優勢 – Rom098

回答

1

我說對了,pthread_mutex_init沒有提供任何安全的方法來同時從不同的進程初始化pthread_mutex_t?

正確。您需要確保只有一個進程在互斥體上調用pthread_mutex_init(),並且在該調用成功返回之前沒有任何進程試圖對互斥體進行操作。

例如,POSIX shm_open()共享內存區域,你可以有進程試圖與O_CREATO_EXCL標誌開區,讓只有一個進程將創建它取得成功。此過程然後負責調整共享內存區域的大小並使用pthread_mutex_init()初始化互斥鎖。其他進程必須等待來自初始化進程的某種通知,然後才能打開共享內存區域 - 例如,您可以讓進程阻止打開FIFO O_RDONLY,並通過打開FIFO O_WRONLY來通知它們(這會導致開放獲得成功)。

通常,共享內存段將不是進程之間的唯一通信通道。通常情況下,您將通過UNIX域套接字引導通信並協商其上的共享內存區域的設置,甚至可能通過帶有SCM_RIGHTS消息的套接字傳遞共享內存區域文件描述符。共享內存區域將被用於加速性能敏感的IPC。