【问题标题】:sharing read-write lock between interprocess进程间共享读写锁
【发布时间】:2020-09-13 15:58:31
【问题描述】:

我有两个进程 rwlock1(parent) 和 rwlock2(child) 。我想在进程之间使用读写锁,我需要将pthread_rwlock_t mem_lock 转移到子进程,我有一个简单的代码,我该如何转移句柄。我不想使用互斥锁。

rwlock1(parent) 的代码

#include <unistd.h>
#include <pthread.h>
#include <sys/wait.h>

pthread_rwlock_t mem_lock;

int main() {
   pid_t pid;

   //init attr
   pthread_rwlockattr_t mem_lock_attr;
   pthread_rwlockattr_init(&mem_lock_attr);
   pthread_rwlockattr_setpshared(&mem_lock_attr, 1);

   //init read writer lock
   pthread_rwlock_init(&mem_lock, &mem_lock_attr);

   pid = fork();
   if (pid == 0) {
       execl("rwlock2", "rwlock2", (char *) nullptr);
   }

   //wait child
   wait(nullptr);

   return 0;
}




【问题讨论】:

    标签: linux readwritelock


    【解决方案1】:

    我还没有尝试过,但是如果您将锁放在共享内存中(例如由mmap 或shmget 设置)并使用pthread_rwlockattr_setpshared 将锁设置为进程,看起来可以做到这一点-共享。

    另见2.9.9 Synchronization Object Copies and Alternative Mappings in IEEE Std 1003.1-2017。

    【讨论】:

    • pthread_rwlock_t 定义为 typedef union { struct __pthread_rwlock_arch_t __data; char __size[__SIZEOF_PTHREAD_RWLOCK_T]; long int __align; } pthread_rwlock_t; ,所以我需要 memcpy(somewhere in shared memory , (char*)&amp;mem_lock,sizeof( pthread_rwlockattr_t) 并从孩子那里拉出来吗?
    • 首先将其分配在共享内存中似乎更好。让家长做pthread_rwlock_t *rlp = mmap(...); pthread_rwlock_init(rlp,...)。然后孩子做pthread_rwlock_t *rlp2 = mmap(...); pthread_rwlock_rdlock(rlp2,...)
    • 我按照你说的试过了,效果很好,谢谢,但是这样使用安全吗?在手册页中执行后,我没有看到 rwlock 的行为。
    • 我不知道为什么它不会。我认为手册页没有提到 exec 因为它没有什么特别之处。如果它被初始化为进程共享,则映射包含锁的内存的两个进程可以使用它;这些进程来自哪里或它们正在执行什么图像都无关紧要。
    猜你喜欢
    • 2021-10-10
    • 2014-10-22
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多