2011-06-25 68 views
3

我想使用一個互斥量,它將用於同步訪問駐留在內存共享b/w兩個不同進程中的一些變量。我怎樣才能做到這一點。代碼示例執行,將非常感激。帶pthreads的進程間互斥

+1

爲什麼你的標題說「pthreads」,但你問的是「過程」?無論如何,你如何在內存映射之間共享內存? –

+0

我在分叉之前分配內存。所以一個過程是父母,另一個是孩子。通過pthread,我的意思是使用pthread_mutex_lock。 – MetallicPriest

+1

我覺得'fork'會創建內存的_copies_,所以它不完全是「共享」的。 –

回答

3

改用 POSIX semaphore代替 1(請參閱下文)使用sem_init作爲未命名信號量或sem_open作爲已命名信號。

sem_t sem; 

/* initialize using sem_init or sem_open */ 

sem_wait(&sem); 
/* critical region */ 
sem_post(&sem); 

多年後最初發布這個答案,它必須被更新。

互斥量實際上應該用來代替信號量。 R和kuga的意見(下文逐字複製)解釋了原因。特別是我發現kuga提到互斥鎖只能通過它們的鎖定線程纔是最引人注目的。


ř

sem_init需要被共享非零pshared的參數,就像一個 互斥需要pshared的屬性。沒有理由爲此選擇 信號量超過互斥量,事實上互斥量會更好,因爲您可以使用強大的互斥量,它允許您處理一個進程在鎖定時死亡的情況(非常真實!)。

KUGA

此外,以R..`s後,一個互斥體只能由線程 用於鎖定它發佈。這通常是必需的,信號量不會提供此功能 。所以這不是正確的答案,傑夫的答案應該被標記爲正確答案 。

+1

這段代碼夠用嗎? – MetallicPriest

+0

@MetallicPriest足夠的是什麼?把更多的精力放在你的問題 – cnicutar

+0

我的意思是,類型sem_t的變量是否需要一些特殊的初始化才能使它適用於進程間通信。 – MetallicPriest

10

以下示例演示了Pthread進程間互斥體的創建,使用和銷燬。將多個進程的示例推廣爲讀者的練習。

#include <pthread.h> 

pthread_mutex_t shm_mutex; 

int main(void) 
{ 
    int err; 
    pthread_mutexattr_t attr; 
    err = pthread_mutexattr_init(&attr); if (err) return err; 
    err = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (err) return err; 
    err = pthread_mutex_init(&shm_mutex, &attr); if (err) return err; 
    err = pthread_mutexattr_destroy(&attr); if (err) return err; 
    err = pthread_mutex_lock(&shm_mutex); if (err) return err; 
    err = pthread_mutex_unlock(&shm_mutex); if (err) return err; 
    err = pthread_mutex_destroy(&shm_mutex); if (err) return err; 
    return 0; 
}