如何在 FreeBSD 中创建进程间 rwlock?

Posted

技术标签:

【中文标题】如何在 FreeBSD 中创建进程间 rwlock?【英文标题】:How do I make an interprocess rwlock in FreeBSD? 【发布时间】:2012-03-12 16:19:35 【问题描述】:

在 FreeBSD 中创建进程间读写锁的方法是什么?我正在寻找类似 pthread 的 rwlock 的东西,它可以通过在 Linux 中成功运行的“pthread_rwlockattr_setpshared”和 PTHREAD_PROCESS_SHARED 标志设置为在进程之间共享。但是 FreeBSD 不支持这个标志。提前谢谢你。

【问题讨论】:

【参考方案1】:

在这里找到了一个基于 posix 信号量的简单且可移植的解决方案: http://stupefydeveloper.blogspot.com/2009/03/nix-rw-lock-with-semaphores.html

#include <semaphore.h>
#include <errno.h>

struct rwlock 
    sem_t rlock;
    sem_t wlock;
;

void init_rwlock(struct rwlock *rw) 
    sem_init(&rw->rlock, 1, 0);
    sem_init(&rw->wlock, 1, 1);


void destroy_rwlock(struct rwlock *rw) 
    wlock(rw);
    sem_destroy(&rw->rlock);
    sem_destroy(&rw->wlock);


void rlock(struct rwlock *rw)
    sem_wait(&rw->wlock);
    sem_post(&rw->rlock);
    sem_post(&rw->wlock);


void wlock(struct rwlock *rw) 
    int readers = 0;
    sem_wait(&rw->wlock);

    do 
        if (sem_getvalue(&rw->rlock, &readers) != -1) 
            if (readers == 0)
                break;
        
        usleep(1);
     while (1);


void runlock(struct rwlock *rw) 
    do 
        if (sem_trywait(&rw->rlock) == -1) 
            if (errno != EAGAIN)
                continue;
        
        break;
     while (1);


void wunlock(struct rwlock *rw) 
    sem_post(&rw->wlock);

【讨论】:

虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。

以上是关于如何在 FreeBSD 中创建进程间 rwlock?的主要内容,如果未能解决你的问题,请参考以下文章

实验八进程间通信

如何在linux中创建一个进程

python multiprocessing:如何从子进程修改在主进程中创建的字典?

如何在 C++ 或 Qt 中创建进程?

如何在执行期间调用在新组件中创建的过程

如何在 Windows ( C++ ) 中创建进程以运行另一段代码?