TinywebServer代码详解–线程同步机制封装类(1) 原项目地址(点击跳转)
博主添加注释后项目地址(点击跳转)
一、基础知识 1.RAII
RAII
全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”.
在构造函数中申请分配资源,在析构函数中释放资源。因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会自动调用析构函数。所以,在RAII
的指导下,我们应该使用类来管理资源,将资源和对象的生命周期绑定
RAII
的核心思想是将资源或者状态与对象的生命周期绑定,通过C++的语言机制,实现资源和状态的安全管理,智能指针是RAII
最好的例子
2.信号量 可以查看之前学习爱编程的大丙,记录的Blog
:多线程与线程同步(点击跳转)
3.互斥量 可以查看之前学习爱编程的大丙,记录的Blog
:多线程与线程同步(点击跳转)
4.条件变量 可以查看之前学习爱编程的大丙,记录的Blog
:多线程与线程同步(点击跳转)
二、代码解析 lock/locker.h
代码较为简单
类中主要是Linux
下三种锁(互斥量、条件变量、信号量)进行封装,将锁的创建于销毁函数封装在类的构造与析构函数中,实现RAII
机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 #pragma once #include <exception> #include <pthread.h> #include <semaphore.h> class locker {public : locker () { if (pthread_mutex_init (&m_mutex,NULL )!=0 ) { throw std::exception (); } } ~locker () { pthread_mutex_destroy (&m_mutex); } bool lock () { return pthread_mutex_lock (&m_mutex) == 0 ; } bool unlock () { return pthread_mutex_unlock (&m_mutex) == 0 ; } pthread_mutex_t *get () { return &m_mutex; } private : pthread_mutex_t m_mutex; }; class cond {public : cond () { if (pthread_cond_init (&m_cond,NULL ) != 0 ) { throw std::exception (); } } ~cond () { pthread_cond_destroy (&m_cond); } bool wait (pthread_mutex_t *m_mutex) { int ret = 0 ; ret = pthread_cond_wait (&m_cond,m_mutex); return ret==0 ; } bool timeWait (pthread_mutex_t *m_mutex,struct timespec t) { int ret = 0 ; ret = pthread_cond_timedwait (&m_cond,m_mutex,&t); return ret ==0 ; } bool signal () { return pthread_cond_signal (&m_cond) == 0 ; } bool broadcast () { return pthread_cond_broadcast (&m_cond) == 0 ; } private : pthread_cond_t m_cond; }; class sem {public : sem () { if (sem_init (&m_sem,0 ,0 ) != 0 ) { throw std::exception (); } } sem (int num){ if (sem_init (&m_sem,0 ,num) != 0 ) { throw std::exception (); } } ~sem () { sem_destroy (&m_sem); } bool wait () { return sem_wait (&m_sem) == 0 ; } bool post () { return sem_post (&m_sem) == 0 ; } private : sem_t m_sem; };