Linux多线程——封装POSIX线程库(二)条件变量的封装

Linux多线程——封装POSIX线程库(二)条件变量的封装

1.Pthread条件变量简介  

条件变量也是线程间同步一个重要的内容,如果说互斥是一个种竞争关系,那么条件变量用于协调线程之间的关系,是一种合作关系。条件变量的应用很多,例如:BlockingQueue,ThreadPool等。 
关于POSIX Pthread简介和示例用法可以参考: 

POSIX Pthread 条件变量

2. 条件变量的封装

其实就是对pthread_cond_t和相关函数的封装:

#include <pthread.h>

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//静态初始化

int pthread_cond_init(pthread_cond_t    *cond,    pthread_condattr_t *cond_attr);//动态初始化

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex, const struct timespec *time);

int pthread_cond_destroy(pthread_cond_t *cond);

3.简易封装代码

(配合上一期代码使用,如果想单独使用,修改锁的部分)

#pragma once

#include <sys/time.h>
#include <pthread.h>
#include "CThreadMutex.h"
class CThreadMutex;
class CCondition
{
public:

	CCondition()
	{
	CHECK(!pthread_cond_init(&m_condition, NULL));//构造操作
	}

	~CCondition()
	{
	CHECK(!pthread_cond_destroy(&m_condition));//析构操作
	}

	//唤醒一个线程
	bool Signal()
	{
		m_mutex.Lock();
		CHECK(!pthread_cond_signal(&m_condition));
		m_mutex.Unlock();
	}
	//广播唤醒所有线程       
	bool Broadcast()
	{
		m_mutex.Lock();
		CHECK(!pthread_cond_broadcast(&m_condition));
		m_mutex.Unlock();
  	}

	//wait
	bool Wait()
	{
		m_mutex.Lock();//wait前必须上锁
		CHECK(!pthread_cond_wait(&m_condition,  m_mutex.getMutexPtr()));
		//pthread_cond_wait阻塞时释放锁,返回时会自动加锁
		m_mutex.Unlock();//还原状态
	}

	//按照时间等待
	bool Wait(const unsigned int timeout)
	{
		struct timeval now;
		struct timespec tmpTimeout;

		gettimeofday(&now, 0);

		tmpTimeout.tv_sec = now.tv_sec + timeout / 1000;
		tmpTimeout.tv_nsec = now.tv_usec * 1000 + timeout % 1000 * 1000 * 1000;

		m_mutex.Lock();
		CHECK(!pthread_cond_timedwait(&m_condition,  m_mutex.getMutexPtr(), &tmpTimeout));
		m_mutex.Unlock();

	}

private:
	
	CCondition(const CCondition&);

	/**
 * @brief prevent copying
 * @note
 */
	CCondition& operator=(const CCondition&);
protected:
	pthread_cond_t m_condition;
    //锁
	CThreadMutex   m_mutex;
};







3. 参考

1.Linux组件封装(二)中条件变量Condition的封装
2.《Linux多线程服务端编程—使用muduo网络库》 
3.pthread 条件变量
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值