2011-06-25 45 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; 
}