2011-04-04 139 views
2

我正在處理讀寫器問題的項目。
我們應該使用二進制信號量作爲計數信號量。
我不允許使用semget/semop/semctl。
首先,我該如何聲明信號量? 我想使用S和V作爲信號量名稱。
我正在用C++編譯這個程序並在unix中運行它。 (克++)使用二進制信號量作爲計數信號量

ADD ON: 類提供與方法之一計數信號:

  • waitSemaphore:如果值> 0放開,else塊
  • signalSemaphore:遞減信號量的值由1個
  • deleteSemaphore :刪除信號量
  • 使用類myCountingSemaphoreUsingBinarySemaphore來解決讀寫器問題
  • readerCount應該是一個全局整數變量。
  • 讀者讀取它。
  • 書寫器通過將10更新爲前一個值來更新它。
  • 讀寫器關閉數據庫值(之前/之後)。
  • 沒有使用像semget/semop/semctl這樣的常規(計數)信號量基元,因爲這些是使用二進制信號量模擬的信號。

回答

1

從它的聲音,你必須讓你自己的信號燈類。您可以使用私有成員變量來像信號量一樣遞增/遞減,並且有一個二進制信號量私有成員來使這些遞增/遞減原子化。發佈/獲取將執行公司/公司的公共方法。當計數器變爲零時釋放二進制信號量,並等待一個條件(另一個互斥量)。當另一個線程在您的信號量類上調用釋放,並且計數器現在大於零時,向所有等待喚醒的人發出信號,並嘗試重新獲得您的信號量。

希望這有助於並有意義。

0

正如@Alexander Kondratskiy指出的那樣,這聽起來像是你應該使用二進制信號量來實現一個真正的信號量。這裏有一個Sempahore實施的一部分,從我個人的一個項目,你仍然需要填補空白...


#ifndef SEMAPHORE_20100517_H_ 
#define SEMAPHORE_20100517_H_ 

#include <Scheduler.h> 
#include <queue> 

class Semaphore { 
public: 
    explicit Semaphore(int count); 

public: 
    void wait(); 
    void signal(); 

private: 
    void block(); 
    void unblock(); 

private: 
    int       value_; 
    std::queue<scheduler::thread> waitlist_; 
    mutex       mutex_; 
}; 

#endif 

Semaphore::Semaphore(int count) : value_(count) { 
    assert(count >= 0); 
} 

void Semaphore::wait() { // same as your P() 

    mutex_.lock(); 

    if(--value_ < 0) { 
     mutex_.unlock(); // we have to give up the lock if we are going to block 
     block(); 
     mutex_.lock(); // reacquire the lock for symmetry when we exit 
    } 

    mutex_.unlock(); 
} 

void Semaphore::signal() { // same as your V() 

    mutex_.lock(); 

    if(++value_ <= 0) { 
     unblock(); 
    } 

    mutex_.unlock(); 
} 

void Semaphore::block() { 
    // Fill in the blanks! 
    // block the current thread and add it to the queue! 
} 

void Semaphore::unblock() { 
    // Fill in the blanks! 
    // pull someone from the queue and unblock them! 
} 
+0

提示:1)請記住,一個互斥量大致爲二進制信號量,後期計數爲1. 2)每次調用block()時,都可以創建一個新的二進制信號量,並將該信號量放入隊列中。然後,實際的塊/解鎖操作變得微不足道。 – 2012-03-06 10:39:45