2012-03-12 4 views
0

Каким образом можно сделать блокировку чтения и записи между процессами в FreeBSD? Я ищу что-то вроде rwlock pthread, которое можно настроить для совместного использования между процессами с помощью флага pthread_rwlockattr_setpshared и PTHREAD_PROCESS_SHARED, который успешно работал в Linux. Но FreeBSD не поддерживает этот флаг. Заранее спасибо.Как сделать interprocess rwlock во FreeBSD?

ответ

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); 
} 
+0

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (http://meta.stackexchange.com/q/8259), чтобы включить здесь основные части ответа и предоставить ссылку для справки. – Lix