2011-04-04 112 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