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

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

【问题讨论】:

    标签: locking ipc freebsd rwlock


    【解决方案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 在这里包含答案的基本部分,并提供链接以供参考。
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2014-12-04
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多