我正在研究一个处理读者作家问题的项目 我们应该使用二进制信号量作为计数信号量 我不允许使用semget / semop / semctl 首先,我如何声明信号量? 我想用S和V作为信号量名称 我正在用c ++构建这个程序并在unix中运行它。 (克++)
ADD ON: 该类提供了一个计数信号量方法:
答案 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!
}