在准备好之前如何阻止共享内存访问?
How do you block shared memory access until it is ready?
我正在尝试在多个进程之间共享一个互斥量。每个进程将在某个随机时间开始 运行ning,因此我需要每个进程都能够设置共享内存并准备好互斥量以供使用。到目前为止效果很好:
int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR);
if (fd < 0) {
fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
//**critical section**
// set up the mutex inside the shared memory
// update permissions so other processes can access the shared memory
fchmod(fd, S_IRUSR | S_IWUSR)
//**critical section**
}
// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()
但是如果我在 else 块的开头添加一个 sleep() 来模拟共享内存的缓慢创建,我 运行 会遇到另一个进程将看到创建的文件并尝试使用的问题马上,在它准备好之前。
在共享内存准备好之前,有什么方法可以阻止 shm_open() 调用吗?就像告诉它等到它有足够的权限打开文件(我的关键部分的最后一步)。或者有什么方法可以在创建文件时立即锁定文件,以便其他进程必须等待它被设置和解锁,flock()?
我实际上已经在这里解决了我自己的问题,有人有任何改进建议吗?
解决方案:
int lock_fd shm_open(setup_control, O_RDWR | O_CREAT, S_IRUSR, S_IWUSR);
flock(lock_fd, LOCK_EX);
int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR, S_IWUSR);
if (fd < 0) {
fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
//**critical section**
// set up the mutex inside the shared memory
//**critical section**
}
flock(lock_fd, LOCK_UN);
// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()
基本上,锁定文件确保只有 1 个进程可以同时获取或设置互斥量,这意味着在 [下一个] 进程打开它已经完成设置的互斥量文件时
我正在尝试在多个进程之间共享一个互斥量。每个进程将在某个随机时间开始 运行ning,因此我需要每个进程都能够设置共享内存并准备好互斥量以供使用。到目前为止效果很好:
int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR);
if (fd < 0) {
fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
//**critical section**
// set up the mutex inside the shared memory
// update permissions so other processes can access the shared memory
fchmod(fd, S_IRUSR | S_IWUSR)
//**critical section**
}
// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()
但是如果我在 else 块的开头添加一个 sleep() 来模拟共享内存的缓慢创建,我 运行 会遇到另一个进程将看到创建的文件并尝试使用的问题马上,在它准备好之前。
在共享内存准备好之前,有什么方法可以阻止 shm_open() 调用吗?就像告诉它等到它有足够的权限打开文件(我的关键部分的最后一步)。或者有什么方法可以在创建文件时立即锁定文件,以便其他进程必须等待它被设置和解锁,flock()?
我实际上已经在这里解决了我自己的问题,有人有任何改进建议吗?
解决方案:
int lock_fd shm_open(setup_control, O_RDWR | O_CREAT, S_IRUSR, S_IWUSR);
flock(lock_fd, LOCK_EX);
int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR, S_IWUSR);
if (fd < 0) {
fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
//**critical section**
// set up the mutex inside the shared memory
//**critical section**
}
flock(lock_fd, LOCK_UN);
// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()
基本上,锁定文件确保只有 1 个进程可以同时获取或设置互斥量,这意味着在 [下一个] 进程打开它已经完成设置的互斥量文件时