您的位置:首页 > 其它

多线程 同步 临界区

2015-10-16 10:06 162 查看
多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作。

除非你让它们同心协力,否则必然会出现“raceconditions”(竞争条件)和“data
corruption”(数据被破坏)的情况。

在典型的办公室文化中,协调工作是由管理者来执行的。类似的解决方案,也就是“让某个线程成为大家的老板”。

临界区

临界区是一段代码(不好理解,见下面更好的解释)。这段代码的作用是处理共享的资源。

这里所谓的资源,并不是指来自.RES

(资源文件)的
Window s
资源,而是广义地指一块内存、一个数据结构或者一个文件。也就是说,“资源”每一次(同一时间内)只能够被一个线程处理。

EnterCriticalSection(&gCriticalSection);

/* Update the resource */ //进入了临界区 处在临界区中的资源受到了保护

LeaveCriticalSection(&gCriticalSection);

这段代码就是一个临界区。

更好的解释:

使用临界区更好理解:声明一个临界区的变量CRITICAL_SECTION。

进入临界区:EnterCriticalSection();

离开临界区:LeaveCriticalSection();

你可能必须在程序的许多地方处理这一块可共享(多个线程共享)的资源。所有这些程序代码可以被同一个critical
section
保护起来。为了阻止问题发生,一次只能有一个线程获准进入critical section

中(相对地也就是说资源受到了保护)。

如果有一个线程已经“进入”某个critical
section
,另一个线程就绝对不能够进入同一个critical section。

用到临界区的情况:

有个int
g_int全局变量。在主线程和子线程中,如果要对该变量进行赋值。那么就要使用临界区,将对该变量进行赋值的代码放入临界区。

临界区的缺点:

Critical section

的一个缺点就是,没有办法获知进入 critical section
中的那个线程是生是死。从另一个角度看,由于
critical section
不是核心对象,如果
进 入 critical section
的 那 个 线 程 结 束 了 或 当 掉 了 , 而 没 有 调 用LeaveCriticalSection()
的话,系统没有办法将该
critical section
清除。如果你需要那样的机能,你应该使用

mu tex(本章稍后将介绍

mu tex)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: