同步访问两个进程之间共享内存中的数据
Synchronized access to data in shared memory between two processes
我有两个进程在共享内存中有数据。这些数据将由这两个过程更新。我一直在寻找两个进程之间的某种锁定机制。使用线程很容易获得共享互斥锁。在我的例子中,我尝试将互斥量变量保存在共享内存中,然后两个进程都将使用它进行锁定。但这没有用。如何在两个进程之间共享互斥量。有人说互斥量不能共享,使用信号量。为什么不能共享互斥量但可以共享信号量?
有可能,你必须使用flag PTHREAD_PROCESS_SHARED:
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
// Init the shared mem barrier
if ( (rv = pthread_mutex_init(&nshared, &mattr)) != 0 ) {
fprintf(stderr, "Failed to initiliaze the shared mutex.\n");
return rv;
}
其中变量 nshared
映射到共享内存中。
看看这个documentation。另外,请记住,互斥量的默认值是不在进程之间共享它。
另外,看看这些帖子post1 post2
检查互斥量状态的奖励代码:
void showPshared(pthread_mutexattr_t *mta) {
int rc;
int pshared;
printf("Check pshared attribute\n");
rc = pthread_mutexattr_getpshared(mta, &pshared);
printf("The pshared attributed is: ");
switch (pshared) {
case PTHREAD_PROCESS_PRIVATE:
printf("PTHREAD_PROCESS_PRIVATE\n");
break;
case PTHREAD_PROCESS_SHARED:
printf("PTHREAD_PROCESS_SHARED\n");
break;
default :
printf("! pshared Error !\n");
exit(1);
}
return;
}
我不记得我是不是拿了这段代码...找到了! here是hal知识的来源
我有两个进程在共享内存中有数据。这些数据将由这两个过程更新。我一直在寻找两个进程之间的某种锁定机制。使用线程很容易获得共享互斥锁。在我的例子中,我尝试将互斥量变量保存在共享内存中,然后两个进程都将使用它进行锁定。但这没有用。如何在两个进程之间共享互斥量。有人说互斥量不能共享,使用信号量。为什么不能共享互斥量但可以共享信号量?
有可能,你必须使用flag PTHREAD_PROCESS_SHARED:
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
// Init the shared mem barrier
if ( (rv = pthread_mutex_init(&nshared, &mattr)) != 0 ) {
fprintf(stderr, "Failed to initiliaze the shared mutex.\n");
return rv;
}
其中变量 nshared
映射到共享内存中。
看看这个documentation。另外,请记住,互斥量的默认值是不在进程之间共享它。
另外,看看这些帖子post1 post2
检查互斥量状态的奖励代码:
void showPshared(pthread_mutexattr_t *mta) {
int rc;
int pshared;
printf("Check pshared attribute\n");
rc = pthread_mutexattr_getpshared(mta, &pshared);
printf("The pshared attributed is: ");
switch (pshared) {
case PTHREAD_PROCESS_PRIVATE:
printf("PTHREAD_PROCESS_PRIVATE\n");
break;
case PTHREAD_PROCESS_SHARED:
printf("PTHREAD_PROCESS_SHARED\n");
break;
default :
printf("! pshared Error !\n");
exit(1);
}
return;
}
我不记得我是不是拿了这段代码...找到了! here是hal知识的来源