Каким образом можно сделать блокировку чтения и записи между процессами в FreeBSD? Я ищу что-то вроде rwlock pthread, которое можно настроить для совместного использования между процессами с помощью флага pthread_rwlockattr_setpshared и PTHREAD_PROCESS_SHARED, который успешно работал в Linux. Но FreeBSD не поддерживает этот флаг. Заранее спасибо.Как сделать interprocess rwlock во FreeBSD?
0
A
ответ
0
Найдено простое и портативное решение, построенное на 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);
}
Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259), чтобы включить здесь основные части ответа и предоставить ссылку для справки. – Lix