首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用二进制信号量作为计数信号量

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

Stack Overflow用户
提问于 2011-04-04 15:01:06
回答 2查看 4.8K关注 0票数 2

我正在做一个关于读者写作问题的项目。

我们应该使用二进制信号量作为计数信号量。

我不允许使用semget/semop/semctl。

首先,我如何声明信号量?我想用S和V作为信号量的名字。

我正在用c++构建这个程序,并在unix中运行它。(g++)

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

  • waitSemaphore:如果值>0,则由1
  • deleteSemaphore:删除
  • signalSemaphore:递减信号量值
  • ,使用类myCountingSemaphoreUsingBinarySemaphore来解决读取器问题
  • readerCount应该是一个全局整数变量。
  • 阅读器会阅读它。
  • Writer通过向前一个值添加10个来更新它。
  • Reader/writer裁剪数据库值(前/后)。
  • 不使用任何传统的(计数)信号量原语,如semget/semop /semctl,因为它们是使用二进制信号量模拟的。

EN

回答 2

Stack Overflow用户

发布于 2011-04-04 15:07:39

从它的声音,你必须做你自己的信号量类。您可以有一个私有成员变量来增加/减少,就像使用信号量一样,并且有一个二进制信号量私有成员来使这些增量/递减成为原子。有发布/获取的公共方法,将做的公司/12月。当计数器变为零时,释放二进制信号量,并在一个条件下等待(另一个互斥)。当另一个线程在您的信号量类上调用release时,当计数器现在超过零时,向所有等待状态唤醒的人发送信号,并尝试重新格式化您的信号量。

希望这有帮助,也有意义。

票数 1
EN

Stack Overflow用户

发布于 2011-04-04 15:20:52

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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!
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5540363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档