首页 > 编程知识 正文

互斥信号量mutex,将模拟信号转换为数字信号需要经过

时间:2023-05-03 16:36:00 阅读:110736 作者:948

c提供互斥量: mutex和条件变量: condition_variable,但没有信号量: semaphore。 由linux和windows系统库提供。 此处简要介绍了信号量的特性,并给出了使用mutex condition_variable实现信号量的简单demo。

信号量的定义

信号量为整数count,提供p操作和v操作两个原子操作

p操作(wait操作) :计数减1; count 0时,中止线程的执行

v操作(信号操作) :对count加1; 如果count=0,则启动执行线程

mutex互斥量相当于一个锁,lock的状态为0、1,也就是lock状态和unlock状态。 如果当前有多个密钥,则数字count最初设置为n,并采用一个密钥count。 如果发现密钥数量小于0,即没有密钥,则此时需要等待。 也可以说是suspend or block。 直到别人释放钥匙。 取完钥匙后还另一把钥匙,即count。 如果这个时候发现count=0,表示这个时候有人在等钥匙,叫醒正在等的线程,把钥匙给他。

如果count=1,则相当于mutex。

如何实现信号量

1、首先需要输入或长整型变量作为计数

2、而且PV操作是原子操作,为了保证互斥至少需要一个mutex

3、因为需要挂起线程或将其唤醒,所以还需要condition_variable

代码

# include iostream # include mutex # include condition _ variable # includethreadnamespacesolution1{ class semaphore { private 336 } //辅助变量、要唤醒的线程数、初始值为0 std:mutex mutex; STD :3360 condition _ variable cond; public : semaphore (intvalue=1) : count (value )、wakeups(0) {} void wait )//P操作) STD3360:unique_loidwait ); --wakeups; } } void signal ()//V操作) STD : lock _ guards TD 33603360 mutex lock ) mutex; if(count=0) { wakeups; cond.notify_one (; }; }; STD :多打印多打印; 解决方案1:3360 semaphore ba (0)、CB )0)、DC ) 0; void a () ) { ba.wait; //B-astd :3360 lock _ guards TD 3360: mutex lock (打印mutex ); STD : cout ' threada ' STD :3360 endl; } void b () { cb.wait; //c-bstd :3360 lock _ guards TD 3360: mutex lock (打印mutex ); STD : cout ' threadb ' STD :3360 endl; ba.signal (; //b-a } void c () { dc.wait ); //d-CSTD :3360 lock _ guards TD 3360: mutex lock (打印mutex ); STD : cout ' threadc ' STD :3360 endl; cb.signal (; //c-b } void d () STD :3360 lock _ guards TD 33603360 mutex lock (打印mutex ); std:cout 'th

read d" <<std::endl; dc.signal(); // d->c }};namespace Solution2 { class semaphore { private: int count; std::mutex mutex; std::condition_variable cond; public: semaphore(int value = 1) : count(value){} void wait() // P操作 { std::unique_lock<std::mutex> lock(mutex); if (--count < 0) { cond.wait(lock); } } void signal() // V操作 { std::lock_guard<std::mutex> lock(mutex); if (++count <= 0) { cond.notify_one(); } } }; std::mutex printMutex; Solution1::semaphore ba(0) , cb(0), dc(0); void a() { ba.wait(); // b->a std::lock_guard<std::mutex> lock(printMutex); std::cout << "thread a" <<std::endl; } void b() { cb.wait(); // c->b std::lock_guard<std::mutex> lock(printMutex); std::cout << "thread b" <<std::endl; ba.signal(); // b->a } void c() { dc.wait(); // d->c std::lock_guard<std::mutex> lock(printMutex); std::cout << "thread c" <<std::endl; cb.signal(); // c->b } void d() { std::lock_guard<std::mutex> lock(printMutex); std::cout << "thread d" <<std::endl; dc.signal(); // d->c }};// 测量一个函数的运行时间template <class T>void measure(T&& func) { using namespace std::chrono; auto start = system_clock::now(); // func func(); duration<double> diff = system_clock::now() - start; std::cout << "执行了" << diff.count() << "秒" << std::endl;}int main(){ measure([](){ std::thread th1(Solution1::a), th2(Solution1::b), th3(Solution1::c), th4(Solution1::d); th1.join(); th2.join(); th3.join(); th4.join(); std::cout << "ending" << std::endl; }); measure([](){ std::thread th1(Solution2::a), th2(Solution2::b), th3(Solution2::c), th4(Solution2::d); th1.join(); th2.join(); th3.join(); th4.join(); std::cout << "ending" << std::endl; }); return 0;}

在linux系统下运行效果如下:

dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ touch main.cppdyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ vim main.cpp dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ g++ -pthread -o main main.cpp dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000541065秒thread dthread cthread bthread aending执行了0.000292463秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000422226秒thread dthread cthread bthread aending执行了0.000189556秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000549342秒thread dthread cthread bthread aending执行了0.000312412秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000521796秒thread dthread cthread bthread aending执行了0.00043399秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000426875秒thread dthread cthread bthread aending执行了0.000244544秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000445409秒thread dthread cthread bthread aending执行了0.000345057秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000377516秒thread dthread cthread bthread aending执行了0.000258996秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000523052秒thread dthread cthread bthread aending执行了0.00027911秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000517352秒thread dthread cthread bthread aending执行了0.000395749秒dyy@dyy-Lenovo-ThinkBook-14-IIL:~/Desktop/HeartBeat$ ./main thread dthread cthread bthread aending执行了0.000488651秒thread dthread cthread bthread aending执行了0.000392515秒

参考
c++11中信号量(semaphore)的实现 | 傻傻的丝袜想人陪的河马br> 深层次探讨mutex与semaphore之间的区别
下面的这个代码比较复杂:
线程同步之信号量,代码实现方法2(条件变量+mutex互斥量)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。