现在的位置: 首页 > 综合 > 正文

多线程管理之信号量

2013年06月03日 ⁄ 综合 ⁄ 共 532字 ⁄ 字号 评论关闭

在多线程中常涉及到数据共享问题

例如一个线程正在写一个文件,另一个线程要清理文件,那么显然两个线程既要共享这一个文件,又要互相排斥

这时候需要一个信号量来管理。保证两个线程不能同时访问同一个文件。

下面是这个信号量的基本实现,以后慢慢扩充功能,例如最长等待时间,剥夺控制权,超时自动释放信号量,自动检测死锁等。

class sema
{
public:
    sema()
    {
        lock = 0;
    }
    void set_lock()
    {
        lock = 1;
    }
    void set_unlock()
    {
        lock = 0;
    }
    bool is_locked()
    {
        return lock == 1;
    }
private:
    int lock;
};

class semaphore
{
public:
    semaphore(sema& sem):_sema(sem)
    {
        //sema=0 表示空闲
        while (_sema.is_locked())
        {
            Sleep(100);
        }
        _sema.set_lock();
    }
    ~semaphore()
    {
        _sema.set_unlock();
    }
private:
    sema& _sema;
};

使用的时候,先申请一个公用的信号量sema,然后使用 semaphore来获取和释放这个信号量。

这样做的好处是当semaphore使用完之后会自动释放信号量

抱歉!评论已关闭.