NetServer开发文档(一)
作者:互联网
NetServer开发笔记(一)
一、 锁的设计
1. MutexLock的设计
是对pthread_mutex的封装,包含的头文件是pthread.h
数据成员:
- pthread_mutex_t mutex
函数成员:
- +MutexLock()
- +~MutexLock()
- +lock()
- +unlock()
- +get()
2. MutexLockGuard的设计
以RALL的方式对MutexLock的封装
数据成员:
- MutexLock& mutex_;
函数接口:
- +MutexLockGuard()
- +~MutexLockGuard()
3. 与muduo网络库的不同
其中还增加了一个_hold数据成员,表示锁住时持有这个锁的线程的真实id(tid),具体看源码
void lock()
{
pthread_mutex_lock(&mutex_);
holder_ = CurrentThread::tid();
}
二、 条件变量的设计
1. Condition的封装
对pthread_cond的封装, 包含的头文件是pthread.h
数据成员:
- MutexLock &mutex //条件变量一般与锁结合使用
- pthread_cond_t cond;
函数成员:
-
+Condition()
-
+~Condition()
-
+wait()
这里是条件等待
-
+notify()
封装了pthread_cond_broadcast,适合于
- 一个生产者多消费者,生产者能一次产生多个产品的情况
- 多生产者多消费者
- 读写锁的实现(写入之后,通知所有读者)
-
+notifyAll()
封装了pthread_cond_signal的情况
- 单一生产者,生产者一次生产一个产品的情况,最好一个消费者
- 注意:pthread_cond_signal在单一异步唤醒的处理线程的情况时,是不安全的
-
waitForSeconds()
这里是计时等待,一段时间内条件没等待就跳出等待
封装了pthread_cond_timedwait(条件变量,互斥锁,等待时间):指定时间内有信号传过来返回0,否则返回非0数
使用该函数需要有三步:
- 加互斥锁
- 调用此函数:解锁——等待——加锁
- 解互斥锁
三、原子封装
1. AtomicIntegerT的封装
包含的头文件stdint.h,模板类,封装了GCC提供的原子性操作
数据成员:
-
volatile T value_
volatile 修饰的变量只能从内存中读取,其作用是防止编译器对其做优化操作
函数成员:
-
+AtomicIntelgerT()
-
+~AtomicIntegerT()
-
+get()
封装了__sync_val_compare_and_swap(,,)
-
+getAndAdd()
封装了_sync_fetch_and_add(,)
-
+addAndGet()
-
+incrementAndGet() //++i
-
+decrementAndGet() //++i
-
+add() //i++
-
+increment()
-
+decrement()
-
+getAndSet()
封装了__sync_lock_test_and_set(,)
四、不可拷贝类的封装
- 只需要拷贝构造函数和赋值运算函数封装成私有函数即可,并将其不允许拷贝的类继承他即可
- 最新的C++11只需将拷贝构造函数与赋值运算函数后面加=delete即可,但是对于此不适用
- 如果不做特殊说明,开发过程中的所有过程都是不能拷贝的
标签:NetServer,封装,函数,cond,开发,文档,pthread,mutex,MutexLock 来源: https://blog.csdn.net/qq_40028201/article/details/94358980