三、lock类的编写与解析 —— TinyWebServer

lock类的编写与解析 —— TinyWebServer

一、前言

这个类的作用作者已经给了解释 —— “多线程同步,确保任一时刻只能有一个线程能进入关键代码段.”
对于这句话其实看了,会有似懂非懂的感觉,然后写代码的时候,就会完全不懂。其实主要大家不懂的原因,可能是没有理解以下几个问题

  • 为什么要把它封装成一个类?难道就只是让他看起来更有层次感?
  • 社长的“庖丁解牛”中的RAII到底是什么?体现在代码中的作用是什么?最新版Web服务器项目详解 - 01 线程同步机制封装类
  • 对于代码中封装的信号量、互斥量、锁,在哪里使用他们,意义是什么?
    lock类
    三、lock类的编写与解析 —— TinyWebServer_第1张图片

二、上述问题回答

Ⅰ、为什么要把它封装成一个类?难道就只是让他看起来更有层次感?

Ⅱ、社长的“庖丁解牛”中的RAII到底是什么?体现在代码中的作用是什么?最新版Web服务器项目详解 - 01 线程同步机制封装类

这两个问题的答案其实就是同一个,给放到一起了。首先封装成类的主要原因就是为了实现RAII
RAII到底是什么呢?为什么要实现它?
下面是社长的解释。
三、lock类的编写与解析 —— TinyWebServer_第2张图片
我画一下重点
三、lock类的编写与解析 —— TinyWebServer_第3张图片
其实理解析构函数,和生命周期,这句话就很好理解了。
简单来说作用就是,创建对象,在作用域(生命周期)结束时,自动调用析构函数释放资源。
所以就是为什么封装成类。
类 有构造函数和析构函数 ,利用构造函数和析构函数的机制实现RAII。

Ⅲ、对于代码中封装的信号量、互斥量、锁,在哪里使用他们,意义是什么?

来看看社长怎么说
三、lock类的编写与解析 —— TinyWebServer_第4张图片
简单来说这个项目后面会写线程池、数据库连接池。需要用信号量、互斥量、锁来保证 “同步,保证操作的原子性”
还是不懂的话,就等我后续文章吧!

三、代码实现

一、信号量

信号量是一种特殊的变量,它只能取自然数值并且只支持两种操作:等待§和信号(V).假设有信号量SV,对其的P、V操作如下:

  • P操作:如果SV的值大于0,则将其减一;若SV的值为0,则挂起执行
  • V操作:如果有其他进行因为等待SV而挂起,则唤醒;若没有,则将SV值加一

二、条件变量

条件变量提供了一种线程间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.

三、互斥量

互斥锁,也成互斥量,可以保护关键代码段,以确保独占式访问.当进入关键代码段,获得互斥锁将其加锁;离开关键代码段,唤醒等待该互斥锁的线程.

实现部分
上述共同点

  • 构造函数
  • 析构函数
  • 类似 P操作
  • 类似V操作

不同点

  • 互斥量,需要获取mutex_t
  • 条件变量,设置超时时间

四、下期预告

日志文件的编写与解析。
原因:本来写完lock类(线程同步机制包装类)应该就是写线程池的。但是由于在线程池类中要用到数据库连接池,数据库连接池又要用到日志。所以下期先写日志。

五、最后

求赞!

你可能感兴趣的:(linux,ubuntu,经验分享,c++)