操作系统 信号量vs互斥锁

 

信号量vs互斥锁

锁是服务于共享资源的;而semaphore多用于控制多个线程间的执行顺序的。

https://www.jianshu.com/p/c6ba8bcc22bc

 


信号量使用场景

1)两个线程交替打印0,1

https://blog.csdn.net/qq_35865125/article/details/108859522

 


c++11信号量实现

c++11中有 mutex (互斥量),有 condition_variable (条件变量),并没有 semaphore (信号量)。需要自己实现。

版本1:

自己实现的信号量类。无非就是让P V操作,即 减一 加一操作,为原子操作,这里借助c++ std::mutex来实现这个原子,也可以使用std::atomic<int>这种原子类型。

#pragma once
#include <iostream>
#include <functional>
#include <mutex>
using namespace std;

//自己实现一个信号量类,无非就是让P V操作,即 减一 加一操作,为原子操作,这里借助
//c++ std::mutex来实现这个原子。
class Semaphore {
public:
    Semaphore(int initVal = 0) :
        s(initVal) {

    }


    void setInitVal(int v) {
        s = v;
    }
    void P()//wait
    {
        while (s <= 0) {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
        m.lock();
        s--;
        m.unlock();
    }
    void V()//notify
    {
        m.lock();
        s++;
        m.unlock();
    }

private:
    std::mutex m;
    int s;
};

验证通过:两个线程交替打印1 2。 定义两个信号量,s1和s2,s1初始化为0,s2初始化为1,使得线程1先进入。

---Note:太过简单,不具备说服力 。

#include<chrono>
#include<thread>
#include <thread>

using namespace std;

Semaphore s1(0);
Semaphore s2(1);


void fun1() {
	while (true) {
		s2.P();
		cout << "1_";
		s1.V();
		std::this_thread::sleep_for(std::chrono::milliseconds(10));
	}
}
void fun2() {
	while (true) {
		s1.P();
		cout << "2_";
		s2.V();
		std::this_thread::sleep_for(std::chrono::milliseconds(10));
	}
}
void main() {
	
	std::thread thread1(fun1);
	std::thread thread2(fun2);

	thread1.join();
	thread2.join();
	cout << endl;
}

 

 

ref:

https://blog.csdn.net/zdarks/article/details/46994767

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页