在多线程中常涉及到数据共享问题
例如一个线程正在写一个文件,另一个线程要清理文件,那么显然两个线程既要共享这一个文件,又要互相排斥
这时候需要一个信号量来管理。保证两个线程不能同时访问同一个文件。
下面是这个信号量的基本实现,以后慢慢扩充功能,例如最长等待时间,剥夺控制权,超时自动释放信号量,自动检测死锁等。
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使用完之后会自动释放信号量