Используя стандарт предварительно протестированный, предварительно созданный материал всегда хорош (например, Повышение как другой предложенный ответ), но это - что-то, что это не слишком твердо для создания самостоятельно. Вот немая небольшая реализация, вытащил из моего проекта:
#include
struct rwlock {
pthread_mutex_t lock;
pthread_cond_t read, write;
unsigned readers, writers, read_waiters, write_waiters;
};
void reader_lock(struct rwlock *self) {
pthread_mutex_lock(&self->lock);
if (self->writers || self->write_waiters) {
self->read_waiters++;
do pthread_cond_wait(&self->read, &self->lock);
while (self->writers || self->write_waiters);
self->read_waiters--;
}
self->readers++;
pthread_mutex_unlock(&self->lock);
}
void reader_unlock(struct rwlock *self) {
pthread_mutex_lock(&self->lock);
self->readers--;
if (self->write_waiters)
pthread_cond_signal(&self->write);
pthread_mutex_unlock(&self->lock);
}
void writer_lock(struct rwlock *self) {
pthread_mutex_lock(&self->lock);
if (self->readers || self->writers) {
self->write_waiters++;
do pthread_cond_wait(&self->write, &self->lock);
while (self->readers || self->writers);
self->write_waiters--;
}
self->writers = 1;
pthread_mutex_unlock(&self->lock);
}
void writer_unlock(struct rwlock *self) {
pthread_mutex_lock(&self->lock);
self->writers = 0;
if (self->write_waiters)
pthread_cond_signal(&self->write);
else if (self->read_waiters)
pthread_cond_broadcast(&self->read);
pthread_mutex_unlock(&self->lock);
}
void rwlock_init(struct rwlock *self) {
self->readers = self->writers = self->read_waiters = self->write_waiters = 0;
pthread_mutex_init(&self->lock, NULL);
pthread_cond_init(&self->read, NULL);
pthread_cond_init(&self->write, NULL);
}
pthreads
не действительно бывший собственный Windows, но общее представление здесь. Эта реализация немного склоняется к писателям (орда писателей может исчерпать ресурсы читатели неограниченно долго); просто измените writer_unlock
, если Вы быть бы баланс быть наоборот.
Да, это - C и не C++. Перевод является осуществлением, оставленным читателю.
Greg Rogers указал, что стандарт POSIX действительно определяет pthread_rwlock_*
. Это не помогает, если Вы не имеете pthreads
, но это размешало мой ум в запоминание: Pthreads-w32 должен работать! Вместо того, чтобы портировать этот код на не - pthreads
для Вашего собственного использования, просто еще используйте Pthreads-w32 в Windows и собственный компонент pthreads
везде.
Time.hs
:
module Time where
...
script.hs
:
import Time
...
Командная строка:
ghc --make script.hs
Если модуль time.hs
находится в том же каталоге, что и ваш «основной» модуль, вы можете просто ввести:
import Time
Можно использовать иерархический структура, так что вы можете написать import Utils.Time
.
Насколько мне известно, то, как вы этого хотите, не сработает.
Для получения дополнительной информации о модулях см. Здесь Learn You a Haskell, Making Our Own Modules .