码迷,mamicode.com
首页 > 编程语言 > 详细

Windows线程同步【2】临界区

时间:2015-04-13 16:53:21      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

临界区是线程同步的一种实现方式。Windows提供了4个关于临界区的函数(InitializeCriticalSection,EnterCriticalSection,LeaveCriticalSection,DeleteCriticalSection),要想使用这些函数,必须先有一个临界区变量,

CRITICAL_SECTION cs;

临界区变量,不能复制,不能移动,也不能读取里面的字段(可以取临界区变量的地址)。总而言之,我们在编写程序时,必须把临界区变量当成一个黑箱,一切对临界区的操作必须通过那4个函数来进行。

在使用临界区之前,必须用InitializeCriticalSection函数将其初始化:

InitializeCriticalSection(&cs);

一个线程可以通过EnterCriticalSection函数来进入一个临界区:

EnterCriticalSection(&cs);

一旦一个线程进入了某个临界区,其他线程便不能进入这个临界区。

一个线程可以通过LeaveCriticalSection函数来离开一个临界区:

LeaveCriticalSection(&cs);

当一个线程离开一个临界区之后,其他线程可以进入这个临界区。

当程序不再需要这个临界区时,别忘记将其销毁。

DeleteCriticalSection(&cs);

用法与示例:

临界区的用法是,如果一个变量(记为x)需要被多个线程共享时,那么可以搞一个临界区。任何一个线程在访问x之前,必须先进入临界区,完成对x的访问后,离开临界区。因为一个临界区在同一时刻只允许一个线程进入,这样就保证了x在同一时刻只能被一个线程访问。

在下面的示例中,n是受临界区保护的变量。

#include <iostream>
#include <windows.h>

CRITICAL_SECTION cs;
int n = 0;

DWORD Thread1(void *)
{
    // 其他代码
    EnterCriticalSection(&cs);
    ++n;
    LeaveCriticalSection(&cs);
    // 其他代码
}

DWORD Thread2(void *)
{
    // 其他代码
    EnterCriticalSection(&cs);
    n = 5;
    LeaveCriticalSection(&cs);
    // 其他代码
}

void main()
{
    InitializeCriticalSection(&cs);
    Sleep(5000);
    DeleteCriticalSection(&cs);
}

Windows线程同步【2】临界区

标签:

原文地址:http://my.oschina.net/jthmath/blog/400510

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!