多线程程序的各线程通常会共享某些资源,比如代码、文件、数据等,这些被共享的资源通常会成为临界资源。各线程访问临界资源的代码区段称作临界区,临界区代码的执行应该是互斥的,否则可能造成错误的行为。解决临界区问题的算法必须满足三个条件:

  • 互斥:临界区的访问应该是互斥进行的;
  • 有空让进:若没有线程的其临界区执行,则应该允许一个或者多个线程请求(进入区)进入其临界区;
  • 有限等待:在有线程在进入区时,任何其他线程都不能霸占临界区,即持续访问临界区的时间或者次数应该有一个上限;

下面的这段代码简易地实现了两个线程互斥地访问临界资源(std::string Critical),可以证明,其满足上述三个条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <windows.h>
#include <string>
using namespace std;
 
//~ 临界资源
string Critical;
 
//~ 两个条件变量
bool flag[2] = {false};
bool turn;
 
DWORD WINAPI SonProcess( LPVOID lpParameter );
 
//~ 进程代号
enum {Dad, Son};
 
int main()
{
	DWORD threadID;
	CreateThread( NULL, 0, SonProcess, NULL,0, &threadID );
 
	//~ 进入区
	flag[Dad] = true;
	turn = Son;
	while(flag[Son] && turn == Son);
 
	//~ 临界区
	Critical = "Little Head Dad";
 
	//~ 退出区
	flag[Dad] = false;
 
	//~ 剩余区
 
	return 0;
 
}
 
DWORD WINAPI SonProcess( LPVOID lpParameter )
{
	//~ 进入区
	flag[Son] = true;
	turn = Dad;
	while(flag[Dad] && turn == Dad);
 
	//~ 临界区
	Critical = "Big Head Boy";
 
	//~ 退出区
	flag[Son] = false;
 
	//~ 剩余区
	ExitThread( 0 );
};
Tags: .
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

RFC: Request For Comments. Orz..

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)