[C++ 网络协议] Windows中的线程同步

目录

1. 用户模式(User mode)和内核模式(Kernal mode)

2. 用户模式的同步(CRITICAL_SECTION)

3. 内核模式同步

3.1 互斥量

3.2 信号量

3.3 事件对象

4. 实现Windows平台的多线程服务器端


1. 用户模式(User mode)和内核模式(Kernal mode)

Windows操作系统的运行方式是“双模式操作”:

  • 用户模式:运行应用程序的基本模式,禁止访问物理设备,而且会限制访问的内存区域。
  • 内核模式:操作系统运行时的模式,不仅不会限制访问的内存区域,而且访问的硬件设备也不会受损。

在应用程序的运行过程中,Windows操作系统会在用户模式和内核模式之间切换。比如说,在Windows中创建线程,虽然创造线程的请求是由应用程序的函数调用来完成的,但是线程是属于操作系统的,所以Windows会先从用户模式切换到内核模式,接着创建线程,分配资源,创建内核对象。

为什么要定义这两种模式?

答:为了提高安全性。因为应用程序在运行时如果发生错误,就可能会破坏操作系统的各种资源。尤其是C/C++可以进行指针运算,就很容易发生这种问题。而用户模式可以保护与操作系统有关的内存区域。所以应用程序在运行时发生错误也只会终止应用程序的运行,而不会终止操作系统。

那这两种模式只有优点吗?

答:不是,频繁的模式切换对系统而言也是一种负担,会影响性能

2. 用户模式的同步(CRITICAL_SECTION)

用户模式的同步是在用户模式下的同步,这意味着,无需操作系统的帮助而在应用程序级别进行的同步 ,即无需进行内核模式的切换。

  • 优点:速度快。

  • 缺点:功能上存在局限性。

创建CRITICAL_SECTION对象:

#include<windows.h>

void InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection    //传入需要初始化的CRITICAL_SECTION对象
                                        //的地址值
);

CRITICAL_SECTION对象,不是内核对象。其只是一把进入临界区的“钥匙”。要进入临界区就提供这一把钥匙,离开临界区就要上交钥匙。

“销毁”CRITICAL_SECTION对象:

#include<windows.h>

void DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection    //传入需要销毁的CRITICAL_SECTION对象
                                        //的地址值
);

实际上这个函数并不是销毁CRITICAL_SECTION对象,而是销毁CRITICAL_SECTION对象使用过的(或与其相关的)资源。

上锁:

#include<windows.h>

void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

解锁:

#include<windows.h>

void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

3. 内核模式同步

内核模式的同步就是在内核模式下的同步。意味着都是通过操作系统的帮助下进行的线程同步。可以实现跨进程之间进行线程同步。(因为内核对象属于操作系统,而不属于进程)

  • 优点:比用户模式提供的功能更多、可以指定超时,防止产生死锁
  • 缺点:速度相对用户模式来说较慢

3.1 互斥量

互斥量对象是"auto-reset"模式的内核对象。([C++ 网络协议] Windows平台下的线程里有解释

创建互斥量:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值