CRITICAL_SECTION 是 Windows 操作系统提供的一种同步对象,用于保护共享资源的并发访问。CRITICAL_SECTION 和 Mutex、Semaphore 一样,是一种互斥对象。但相比于 Mutex 和 Semaphore,CRITICAL_SECTION 的性能更高,因为它是基于用户模式的同步对象而不是基于内核模式的同步对象。
CRITICAL_SECTION 的使用方法如下:
1. 初始化 CRITICAL_SECTION
可以使用 InitializeCriticalSection() 函数或者 InitializeCriticalSectionAndSpinCount() 函数来初始化 CRITICAL_SECTION 对象。
- InitializeCriticalSection() 函数:
```C++
VOID WINAPI InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
```
- InitializeCriticalSectionAndSpinCount() 函数:
```C++
BOOL WINAPI InitializeCriticalSectionAndSpinCount(
LPCRITICAL_SECTION lpCriticalSection,
DWORD dwSpinCount
);
```
2. 进入临界区
可以使用 EnterCriticalSection() 函数来进入临界区。
```C++
VOID WINAPI EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
```
如果当前不存在任何线程处于临界区内,当前线程会立刻进入临界区。否则,当前线程会一直等待直到其他线程退出临界区。
3. 退出临界区
可以使用 LeaveCriticalSection() 函数来退出临界区。
```C++
VOID WINAPI LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
```
当当前线程退出临界区时,其他等待进入临界区的线程才有机会进入临界区。
4. 销毁临界区
可以使用 DeleteCriticalSection() 函数来销毁临界区。
```C++
VOID WINAPI DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection
);
```
接下来,我们通过实例来演示如何使用 CRITICAL_SECTION。
假设现在有两个线程,它们共享一个变量 n。
```C++
int n = 0;
```
在第一个线程中,我们会进入临界区并对变量 n 做加 1 操作。然后,等待一段时间,再退出临界区。
```C++
while (true) {
EnterCriticalSection(&cs);
n++;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
LeaveCriticalSection(&cs);
}
```
在第二个线程中,我们也会进入临界区并对变量 n 做减 1 操作。然后,等待一段时间,再退出临界区。
```C++
while (true) {
EnterCriticalSection(&cs);
n--;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
LeaveCriticalSection(&cs);
}
```
在主线程中,我们会初始化 CRITICAL_SECTION 和创建两个线程。
```C++
int main() {
InitializeCriticalSection(&cs);
std::thread t1(func1);
std::thread t2(func2);
t1.join();
t2.join();
DeleteCriticalSection(&cs);
return 0;
}
```
通过上述代码,我们成功地实现了对共享变量的并发修改操作,并且使用了 CRITICAL_SECTION 来保护共享变量的一致性。
总结一下,CRITICAL_SECTION 是 Windows 操作系统提供的一种重要的同步对象,用于保护共享资源的并发访问。它比 Mutex 和 Semaphore 有更高的性能,并且容易使用。虽然 CRITICAL_SECTION 是基于用户模式的同步对象,但它对于保护小型共享资源仍然是非常有效的。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
祝你在新的一年里身体健康,多福多寿。Rich blessings for health and longevity is my special wish for you in the coming year.