我正在做一个关于读者写作问题的项目。
我们应该使用二进制信号量作为计数信号量。
我不允许使用semget/semop/semctl。
首先,我如何声明信号量?我想用S和V作为信号量的名字。
我正在用c++构建这个程序,并在unix中运行它。(g++)
ADD ON:该类为一个计数信号量提供了方法:
。
发布于 2011-04-04 15:07:39
从它的声音,你必须做你自己的信号量类。您可以有一个私有成员变量来增加/减少,就像使用信号量一样,并且有一个二进制信号量私有成员来使这些增量/递减成为原子。有发布/获取的公共方法,将做的公司/12月。当计数器变为零时,释放二进制信号量,并在一个条件下等待(另一个互斥)。当另一个线程在您的信号量类上调用release时,当计数器现在超过零时,向所有等待状态唤醒的人发送信号,并尝试重新格式化您的信号量。
希望这有帮助,也有意义。
发布于 2011-04-04 15:20:52
正如@所指出的,听起来您应该使用二进制信号量来实现真正的信号量。这是我的一个个人项目的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_;
};
#endifSemaphore::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!
}https://stackoverflow.com/questions/5540363
复制相似问题