c++11中信号量实例

      C++11的新特性中,一些封装的库使得开发人员更加方便,比如thread,mutex等这些都是Linux常用的库,而关于semaphore信号量相关的封装,却没有做到。然而我们可以利用互斥量和条件变量来进行信号量的封装。


    在Linux平台下,对于信号量的介绍,通常会提到P/V操作,它们是信号量的基础,它们的概念分别如下。

P操作 (wait操作):count 减1;如果 count < 0 那么挂起执行线程;

V操作 (signal操作):count 加1;如果 count <= 0 那么唤醒一个执行线程;


    而本次在C++11中对信号量的封装,P操作被定义为成员函数wait(),V操作被定义为signal(),通过创建对象的方法,创建、初始化信号量,而sem_init()操作已在创建信号量对象中执行,具体看实例。


    下面是一个简单的实例,供大家参考。新建两个线程,分别执行func1、func2两个函数,func1函数实现对全局变量num的减1操作,func2函数则打印出全局变量num的值。我们通过信号量的方法,做到每次num数值减1时,打印输出一次,实现对两个函数func1、func2的同步操作。

代码如下:

class semaphore {
public:
	semaphore(int value = 1) : count{ value } {}

	void wait() {
		std::unique_lock lock{ mutex };
		if (--count<0) // count is not enough ?
			condition.wait(lock); // suspend and wait...
	}
	void signal() {
		std::lock_guard lock{ mutex };
		if (++count <= 0) // have some thread suspended ?
			condition.notify_one(); // notify one !
	}

private:
	int count;
	std::mutex mutex;
	std::condition_variable condition;
};#define _CRT_SECURE_NO_WARNINGS    //VS2013 VS2015需要加上此行,去除安全检查
#include 
#include 
#include 
#include 
#include 
#include "sem.h"

int num = 10;
semaphore sem1(0);//相当于Linux下sem_init(&sem1,0,0);
semaphore sem2(1);//相当于Linux下sem_init(&sem2,0,1);

void func1()
{
	printf("func1() begin!\n");
	while (1)
	{
		if (num > 0)
		{
			sem1.wait();//阻塞,等待sem1.signal();执行后才会返回
			num--;
			sem2.signal();
		
		}
		else
		{
			printf("func1() return \n");
			return;
		}
	}
}

void func2()
{
	printf("func2() begin!\n");
	while (1)
	{
		if (num > 0)
		{
			sem2.wait();//阻塞,等待sem2.signal();执行后才会返回
			printf("num is %d\n", num);
			Sleep(1000);//休眠1000ms,效果更明显
			sem1.signal();
		}
		else
		{
			printf("func2() return \n");
			return;
		}

	}
}


你可能感兴趣的:(Linux,C/C++)