【C++项目】Tiny Linux WebServer---逻辑单元前置---线程同步


前言

上篇【C++项目】Tiny Linux WebServer—webserver架构分析与介绍已经简单介绍了webserver基础架构各个单元部分的简要功能与需要采用的技术。接下来我们将要介绍逻辑单元部分的实现。

逻辑单元

逻辑单元主要负责处理I/O输入输出,http请求报文解析等逻辑。而为了提高服务器效率,我们需要采用多线程方式实现逻辑单元的并发实行。而实现多线程并发执行,我们使用线程同步以及线程池技术实现以减少服务器的资源安全以及资源消耗。后面将分别讲解线程同步以及线程池。

线程同步

前置介绍

线程主要优势在于,能够通过全局变量来共享信息,不过这种便捷的共享是有代价的;必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。

线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作,而其他线程则处于等待状态

临界区:访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应中断该片段的执行

互斥量 pthread_mutex_t

      为避免线程更新共享变量时出现问题,可以使用互斥量(mutex 是 mutual exclusion 的缩写)来确保同时仅有一个线程可以访问某项共享资源。可以使用互斥量来保证对任意共享资源的原子访问

       互斥量有两种状态:已锁定(locked)和未锁定(unlocked)。任何时候,至多只有一个线程可以锁定该互斥量。试图对已经锁定的某一互斥量再次加锁,将可能阻塞线程或者报错失败,具体取决于加锁时使用的方法。

      一旦线程锁定互斥量,随即成为该互斥量的所有者,只有所有者才能给互斥量解锁。一般情况下,对每一共享资源(可能由多个相关变量组成)会使用不同的互斥量,每一线程在访问同一资源时将采用如下协议:
⚫ 针对共享资源锁定互斥量
⚫ 访问共享资源
⚫ 对互斥量解锁
       如果多个线程试图执行这一块代码(一个临界区),事实上只有一个线程能够持有该互斥量(其他线程将遭到阻塞),即同时只有一个线程能够进入这段代码区域,如下图所示:

互斥量主要作用是在多线程环境下,对共享资源的互斥访问,从而保护共享资源的安全性。常理解为当线程A希望访问共享资源时,会对共享资源或者临界区加上锁,此时其他线程无法对临界区或者共享资源进行访问。其可以理解为下图:
Linux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。接下来,介绍相关的mutex系统函数:

关键字:restrict 它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码。

pthread_mutex_t *restrict mutex = xxx;
pthread_mutex_t * mutex1 = mutex;(报错)
#inculde<pthread.h> //头文件

int pthread_mutex_init(pthread_mutex_t * restrict mutex,const pthread_mutexattr_t *restrict attr);
功能:初始化互斥量
参数:
	mutex:需要初始化的互斥量变量
	attr:互斥量相关的属性,常设为NULL
返回值:
	 int:  0 创建成功   其他任何返回值都表示出现了错误。如果出现以下情况,该函数将失败并返回对应的值。
	 ENOMEM 描述:内存不足,无法初始化互斥锁属性对象。

===================================================================================================
int pthread_mutex_destroy(pthread_mutex_t * mutex);
功能:释放互斥量资源
参数:传递互斥量变量
返回值:
     -  互斥锁销毁函数在执行成功后返回 0,否则返回错误码。
 =================================================================================================
 int pthread_mutex_lock(phtread_mutex_t* mutex);
 功能:对临界区进行加锁,该方法为阻塞线程,如果有一个线程阻塞了,那么其他线程就会等待
 参数:互斥量
 返回值:
    - 0 加锁成功 加锁不成功会阻塞等待
 ==========================================================</
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值