进程间通信 -- 在共享内存中锁定互斥体
InterProcess communication -- Locking Mutex in shared memory
我有 2 个进程将执行相同的代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <pthread.h>
#ifndef _POSIX_THREAD_PROCESS_SHARED
#error This system does not support process shared mutex
#endif
struct shm_content
{
pthread_mutex_t mutex;
};
pthread_mutex_t *mptr; //Mutex Pointer
pthread_mutexattr_t matr; //Mutex Attribute
int shared_mem_id; //shared memory Id
int *mp_shared_mem_ptr; //shared memory ptr -- pointing to mutex
int main (void)
{
int rtn;
size_t shm_size;
/* initialize shared memory segment */
shm_size = 1*sizeof(pthread_mutex_t);
if ((shared_mem_id = shmget(IPC_PRIVATE, shm_size, 0660)) < 0)
{
perror("shmget"), exit(1) ;
}
if ((mp_shared_mem_ptr = (int *)shmat(shared_mem_id, (void *)0, 0)) == NULL)
{
perror("shmat"), exit(1);
}
//Offset to find the location of the mutex variable in the shared memory
shm_content* pcontent = reinterpret_cast<shm_content*>(mp_shared_mem_ptr);
mptr = &(pcontent->mutex);
// Setup Mutex
if (rtn = pthread_mutexattr_init(&matr))
{
fprintf(stderr,"pthreas_mutexattr_init: %s",strerror(rtn)),exit(1);
}
if (rtn = pthread_mutexattr_setpshared(&matr,PTHREAD_PROCESS_SHARED))
{
fprintf(stderr,"pthread_mutexattr_setpshared %s",strerror(rtn)),exit(1);
}
if (rtn = pthread_mutex_init(mptr, &matr))
{
fprintf(stderr,"pthread_mutex_init %s",strerror(rtn)), exit(1);
}
// Lock mutex and then wait for signal to relase mutex
printf("child mutex lock n");
pthread_mutex_lock( mptr );
printf("child mutex lockedn");
int i = 0; // :)
//busy wait
while (i<10)
{
printf("Busy Wait!!! I AM PROCESS 1n");
//in the second process will change this line to :
//printf("Busy Wait!!! I AM PROCESS 2n");
sleep(2);
}
printf("child mutex unlockn");
pthread_mutex_unlock( mptr );
printf("child mutex unlockedn");
}
我预计第二个进程只有在第一个进程释放互斥锁后才能获取互斥锁,但现在它接缝有 2 个互斥锁副本,每个进程都可以锁定自己的互斥锁。
有什么想法吗?
if ((shared_mem_id = shmget(IPC_PRIVATE, shm_size, 0660)) < 0)
^^^^^^^^^^^
您的共享内存对每个进程都是私有的,因此其中的互斥锁对每个进程都是私有的。
内存和互斥锁将跨分叉继承,但这与您当前的设计无关。
您需要非专用共享内存。 这将是放弃 SysV 风格的共享内存接口(shmget()
等)并采用更简单的 POSIX 接口(shm_open()
等)的好时机。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 共享内存的升压容器是否实现锁定?
- 是否可以锁定应用程序中常见控件使用的内存?
- 如何判断虚拟内存页是否已锁定
- 进程间通信 -- 在共享内存中锁定互斥体
- 视窗C++ 锁定内存中的文件
- 互斥锁锁定内存的哪一部分?(线程)
- CUDA和固定(页面锁定)内存根本没有页面锁定
- 如何在boost(c++)中将内存页锁定到物理RAM
- 在C++中为可变长度记录锁定空闲共享内存
- 乐观读取并使用 C/C++锁定 STM(软件事务内存)
- 释放锁定的内存是否会解锁相应的页面
- 自旋锁定堆栈和内存屏障(C++)
- 为什么pthread_mutex_t尝试锁定来自两个不同进程的共享内存时会出现段错误
- 这些锁定的内存访问是等价的吗?