读写器访问多个读者

我在UNIX中实现WRITER-READER问题时遇到了一些问题。 首先是我不知道,我怎么能修改代码才能像线程一样调用进入阅览室。 例如,当作家在阅览室时,读者正在等待进入阅览室。 当作家逃离阅览室,读者进入阅览室时,他仍在等待机会。 第二个是我不知道如何修改代码以允许一些读者进入阅览室。 在我的代码中,只有一个线程可以在阅览室中同时进行。 第三个是,如何识别作家或读者是否在挨饿? 哪一个在我的代码中挨饿?

这是代码:

#include  #include  #include  #define READERS 15 #define WRITERS 10 int bufferw = 0, bufferr = 0, counterw = WRITERS, counterr = READERS; int i; pthread_mutex_t mwrite, mread; pthread_cond_t condw, condr; pthread_t r[READERS], w[WRITERS]; void *writer(void *ptr) { pthread_mutex_lock(&mwrite); { counterr = READERS; counterw = WRITERS; ++bufferw; for(i=0; i 0) pthread_cond_wait(&condw, &r[i]); printf("WRITER ENTERING!"); pthread_mutex_unlock(&mwrite); bufferw--; } pthread_cond_signal(&condr); pthread_exit(0); } void *reader(void *ptr) { counterr = READERS; counterw = WRITERS; { ++bufferr; for(i=0; i<WRITERS; i++) while(bufferw == 1) pthread_cond_wait(&condr, &w[i]); printf("READER ENTERING!"); bufferr = 0; } pthread_cond_signal(&condw); pthread_exit(0); } int main(int argc, char* argv[]) { pthread_mutex_init(&mwrite, 0); pthread_mutex_init(&mread, 0); pthread_cond_init(&condw, 0); pthread_cond_init(&condr, 0); for(i=0; i<WRITERS; i++) pthread_create(&w[i], NULL, writer, NULL); for(i=0; i<READERS; i++) pthread_create(&r[i], NULL, reader, NULL); for(i=0; i<WRITERS; i++) pthread_join(w[i], NULL); for(i=0; i<READERS; i++) pthread_join(r[i], NULL); pthread_cond_destroy(&condw); pthread_cond_destroy(&condr); pthread_mutex_destroy(&mwrite); pthread_mutex_destroy(&mread); return 0; } 

在此先感谢您的帮助!

编辑://在这种情况下如何避免竞争?

你可以使用一个互斥量和两个条件变量来实现它。

`

 reader( ) { pthread_mutex_lock(&m); while (!(writers == 0)) pthread_cond_wait(&readersQ, &m); readers++; pthread_mutex_unlock(&m); /* actual read */ pthread_mutex_lock(&m); if (--readers == 0) pthread_cond_signal(&writersQ); pthread_mutex_unlock(&m); } writer( ) { pthread_mutex_lock(&m); writers++; while (!((readers == 0) && (active_writers == 0))) { pthread_cond_wait(&writersQ, &m); } active_writers++; pthread_mutex_unlock(&m); /* actual write */ pthread_mutex_lock(&m); writers--; active_writers--; if (writers > 0) pthread_cond_signal(&writersQ); else pthread_cond_broadcast(&readersQ); pthread_mutex_unlock(&m); } 

`

这种实现对读者来说是不公平的,这意味着如果有作家写作,读者永远不会有选择阅读。 这是因为写作比阅读更重要。 如果你不这么认为,我也可以提供一个对作家不公平的版本。

只有当写入者等于零时,读者才能选择读取。 如果只有一个编写器,则编写器不会为零,读者无法读取。

如果有多个写入器,则变量active_writers将确保一次只能写入一个写入器。

编辑

下面是版本饥饿的作家。 对于读者来说,它是相同的代码。

 writer( ) { pthread_mutex_lock(&m); while(!((readers == 0) &&(writers == 0))) pthread_cond_wait(&writersQ, &m); writers++; pthread_mutex_unlock(&m); /* actual write */ pthread_mutex_lock(&m); writers--; pthread_cond_signal(&writersQ); pthread_cond_broadcast(&readersQ); pthread_mutex_unlock(&m); }