线程同步:临界区与互斥锁详解
1. 临界区(Critical Sections)
临界区是一段同一时间只能由一个线程执行的代码区域。若多个线程同时执行临界区代码,可能会导致不可预测和错误的结果。
Windows 提供了临界区对象(CS)作为一种简单的“锁”机制,用于实现和强制执行临界区的概念。以下是关于临界区的详细信息:
- 初始化与删除 :使用特定函数来初始化和删除临界区变量及其资源。在初始化之前或删除之后,不能对临界区执行任何操作,但可以重新初始化。
- 进入与离开 :线程通过特定函数进入和离开临界区,同一时间只有一个线程可以处于特定的临界区。线程可以在程序的多个点进入和离开特定的临界区。
- 递归特性 :临界区是递归的。如果一个线程已经拥有临界区,它可以再次进入而不会被阻塞。Windows 会维护一个计数,线程必须离开临界区的次数与进入的次数相同,才能为其他线程解锁临界区。
- 性能优势 :临界区不是内核对象,而是在用户空间维护的。与具有类似功能的 Windows 互斥内核对象相比,这几乎总是能提高性能,尤其是在 NT5 及更高版本中。
下面是一个使用临界区解决两个线程递增同一变量问题的示例代码:
M
4
5
5
6
EntCritSec(&cs1);
M = N;
M = M + 1;
Running
N = M;
LeaveCritSec(&cs1)
Running
···
Re
超级会员免费看
订阅专栏 解锁全文
1122

被折叠的 条评论
为什么被折叠?



