深入理解CRITICAL_SECTION

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/

点赞(113) 打赏

评论列表 共有 1 条评论

只是小伤口用时间包扎 11月前 回复TA

祝你在新的一年里身体健康,多福多寿。Rich blessings for health and longevity is my special wish for you in the coming year.

立即
投稿
发表
评论
返回
顶部