使用二进制信号量作为计数信号量

时间:2011-04-04 15:01:07

标签: c++ semaphore

我正在研究一个处理读者作家问题的项目 我们应该使用二进制信号量作为计数信号量 我不允许使用semget / semop / semctl 首先,我如何声明信号量? 我想用S和V作为信号量名称 我正在用c ++构建这个程序并在unix中运行它。 (克++)

ADD ON: 该类提供了一个计数信号量方法:

  • waitSemaphore:if value> 0取消阻止,否则阻止
  • signalSemaphore:将信号量值递减1
  • deleteSemaphore:删除信号量
  • 使用类myCountingSemaphoreUsingBinarySemaphore来解决读写器问题
  • readerCount应该是一个全局整数变量。
  • 读者阅读。
  • Writer通过将10添加到上一个值来更新它。
  • 读取器/写入器管理数据库值(之前/之后)。
  • 不使用任何常规(计数)信号量原语,如semget / semop / semctl,因为那些是你使用二进制信号量模拟的那些。

2 个答案:

答案 0 :(得分:1)

从它的声音来看,你必须创建自己的信号量类。您可以使用私有成员变量来增加/减少信号量,并使用二进制信号量私有成员来使这些增量/减量成为原子。发布/获取将执行inc / dec的公共方法。当计数器变为零时释放二进制信号量,并等待一个条件(另一个互斥锁)。当另一个线程调用你的信号量类上的释放,并且计数器现在高于零时,向所有等待条件的人发出信号唤醒,并尝试重新获取你的信号量。

希望这有帮助并且有意义。

答案 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!
}