2012-04-30 152 views
0

我有共享內存,x個作者,y個讀者,一個父進程。作家有獨家訪問權限,所以一個作家可以寫作,其他讀者和作家必須等待。多個閱讀器可以並行讀取。優先考慮的是作家,例如,如果3位讀者正在閱讀,並且一位作者想要寫入該共享內存,那麼當這3位讀者完成他們的工作時,沒有更多的讀者可以閱讀並且作家可以寫作。我不知道如何通過信號量來實現它,因爲讀者可以並行讀取,因此下一個代碼將無法工作,因爲那麼所有讀者都將在該信號量中等待。訪問共享內存同步

//reader 
if(isWriterActive()) 
{ 
    sem_wait(semReaderStop); 
} 

//writer 
sem_wait(semReaderStop()); 
. 
. 
sem_post(semReaderStop()); 

我覺得這樣的事情不好,因爲它沒有阻塞。

//readers doJob 
if(isWriterActive()) 
{ 
    return E_WRITER_ACTIVE; 
} 

while(doJob()==E_WRITER_ACTIVE); 
+0

這是讀卡器/寫卡器鎖的常用描述。看看pthread_rwlock http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_rwlock_init.html – gastush

+0

永遠不要試圖自己實現鎖定原語。只要使用正常的讀/寫鎖(但要確保他們的行爲是這樣的,作家不會餓死)。 – ugoren

+0

我需要使用信號量(學校)。 – Krab

回答

1

你需要一個P線程讀取/寫入器鎖 - 有在Linux NPTL作家飢餓一些背景here

+0

不,我只能使用信號量。 – Krab

+0

你確定你不被允許使用'rw_semaphore'嗎? http://tuxthink.blogspot.com/2011/05/reader-writer-semaphores-in-linux.html –

0

您的問題是經典生產者/消費者問題的變體(沒有給定的讀/寫操作同步約束)。下面的僞代碼允許必須解決您的問題:

// globals 
semaphore writers = 1; // "binary semaphore" 
semaphore readers = 1; // "counting semaphore" 

void writer() { 
    sem_wait(writers); // wait until there's no writers 
    sem_wait(readers); // wait until there's no readers 

    // safe write context: no-one else can read nor write 

    sem_post(readers); // signal other readers can run 
    sem_post(writers); // signal other writers can run 
} 

void reader() { 
    sem_wait(writers); // wait until there's no writers 
    sem_post(readers); // there's one more reader active 

    // safe read context: others can read, but no-one else can write 

    sem_wait(readers); // this reader is completed 
    sem_post(writers); // signal other writers can run 
} 

欲瞭解更多信息,同步看到這lecture,但網上用一本好書一樣的Tanenbaum的Modern Operating Systems我建議你閱讀有關Dijkstra Semaphores越跌。