moduo网络库的reactor模式
moduo网络库的reactor模式基本构成为“non-blocking I/O + I/O multiplexing”,程序的基本结构是一个事件循环(event loop),以事件驱动(event-driven)和事件回调(event callback)的方式实现业务逻辑。此文参照陈硕的moduo网络库稍作简化,抽出reactor模式的基本框架。
1、线程同步:采用底层同步原语,互斥器+条件变量
线程同步尽量使用高级并发编程构建。若要使用底层同步原语,则尽量只使用互斥器和条件变量。互斥器和条件变量构成了多线程编程的全部必备同步原语,用它们即可完成任何多线程同步任务。
(1)封装互斥器
封装互斥器保护对象共享资源,不同对象间不会构成锁争用。其中:
MutexLock封装临界区。用RAII手法封装互斥器的创建与摧毁。
MutexLockGuard封装临界区的进入和退出,即加锁和解锁。它是一个栈上对象,作用域刚好等于临界区域。
#ifndef MUTEXLOCKGUARD_H_
#define MUTEXLOCKGUARD_H_
#include <pthread.h>
#include "Thread.hpp"
#include <iostream>
class MutexLock //: boost::noncopyable
{
private:
pthread_mutex_t mutex_;
MutexLock(const MutexLock&);
MutexLock& operator=(const MutexLock&);
public:
MutexLock(){ pthread_mutex_init(&mutex_,NULL); }
~MutexLock(){ pthread_mutex_destroy(&mutex_); }
void lock() { pthread_mutex_lock(&mutex_); }
void unlock() { pthread_mutex_unlock(&mutex_); }
pthread_mutex_t* getPthreadMutex() { return &mutex_; }
};
class MutexLockGuard //: boost::noncopyable
{
private:
MutexLock mutex_;
MutexLockGuard(const MutexLockGuard&);
MutexLockGuard& operator=(const MutexLockGuard&);
public:
explicit MutexLockGuard( MutexLock& mutex ) : mutex_(mutex)
{
mutex_.lock();
std::cout<<"tid "<<CurrentThreadtid()<<": MutexLockGuard lock!"<<std::endl;
}
~MutexLockGuard()
{
mutex_.unlock();
std::cout<<"tid "<<CurrentThreadtid()<<": MutexLockGuard unlock!"<<std::endl;
}
};
#define MutexLockGuard(x) static_assert(false, "missing mutex guard var name")
//C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。
//如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串。
#endif // MUTEXLOCKGUARD_H_
(2)封装条件变量
条件变量是非常底层的同步原语,用于线程同步。很少直接使用,一般只用于实现高层同步措施,如阻塞队列(blockingQueue<T>),倒计时(countDownLatch)等。需要注意:
在wait端,要与mutex一起