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

C++ 使用二进制信号量作为计数信号量,c++,semaphore,C++,Semaphore,我正在从事一个处理读者-作者问题的项目。 我们应该使用二进制信号量作为计数信号量。 我不允许使用semget/semop/semctl。 首先,如何声明信号量? 我想使用S和V作为信号量名称。 我正在用C++构建这个程序并在UNIX中运行它。(g++) 附加内容: 该类提供了一个带有方法的计数信号量: waitSemaphore:如果值>0,则取消阻止,否则阻止 信号量:将信号量值减少1 删除信号量:删除信号量 使用MyCountingSemaphoreUsingBinarySmaphore类

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

附加内容: 该类提供了一个带有方法的计数信号量:

  • waitSemaphore:如果值>0,则取消阻止,否则阻止
  • 信号量:将信号量值减少1
  • 删除信号量:删除信号量
  • 使用MyCountingSemaphoreUsingBinarySmaphore类来解决读写器问题
  • readerCount应该是一个全局整数变量
  • 读者阅读它
  • Writer通过在以前的值上添加10来更新它
  • 读写器计算数据库值(前/后)
  • 不使用任何常规(计数)信号量原语,如semget/semop/semctl,因为这些是您正在使用二进制信号量模拟的原语
从它的声音来看,您必须创建自己的信号量类。您可以使用私有成员变量作为信号量的增量/减量,并使用二进制信号量私有成员使这些增量/减量原子化。让release/acquire公共方法执行inc/dec。当计数器变为零时,释放二进制信号量,并等待一个条件(另一个互斥)。当另一个线程调用您的信号量类上的release时,计数器现在高于零,向所有等待条件的人发出信号,让他们醒来,并尝试重新获取您的信号量


希望这能有所帮助并有意义。

正如@Alexander Kondratskiy所指出的,听起来您应该使用二进制信号量来实现真正的信号量。这是我个人项目中Sempahore实现的一部分,您仍然需要填补空白


\ifndef信号量\u 20100517\u H_
#定义信号量\u 20100517\u H_
#包括
#包括
类信号量{
公众:
显式信号量(int计数);
公众:
无效等待();
无效信号();
私人:
空块();
void unblock();
私人:
int值;
std::队列等待列表;
互斥互斥;
};
#恩迪夫

信号量::信号量(int计数):值(计数){ 断言(计数>=0); } void信号量::wait(){//与P()相同 互斥锁; 如果(--值<0){ mutex.unlock();//如果要阻止,必须放弃锁 block(); mutex.lock();//退出时重新获取对称锁 } 互斥锁.解锁(); } void信号量::signal(){//与V()相同 互斥锁; 如果(++value_uu)提示:1)记住互斥量大致是一个二进制信号量,以post计数1开始。2)每次调用block()时,您可以创建一个新的二进制信号量,并将该信号量放入队列中。那么实际的阻塞/取消阻塞操作就变得微不足道了。
#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!
}