Linux多线程——封装POSIX线程库(二)条件变量的封装
1.Pthread条件变量简介
条件变量也是线程间同步一个重要的内容,如果说互斥是一个种竞争关系,那么条件变量用于协调线程之间的关系,是一种合作关系。条件变量的应用很多,例如:BlockingQueue,ThreadPool等。
关于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 条件变量