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,因为这些是您正在使用二进制信号量模拟的原语李>
希望这能有所帮助并有意义。正如@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!
}