多线程程序的各线程通常会共享某些资源,比如代码、文件、数据等,这些被共享的资源通常会成为临界资源。各线程访问临界资源的代码区段称作临界区,临界区代码的执行应该是互斥的,否则可能造成错误的行为。解决临界区问题的算法必须满足三个条件:
- 互斥:临界区的访问应该是互斥进行的;
- 有空让进:若没有线程的其临界区执行,则应该允许一个或者多个线程请求(进入区)进入其临界区;
- 有限等待:在有线程在进入区时,任何其他线程都不能霸占临界区,即持续访问临界区的时间或者次数应该有一个上限;
下面的这段代码简易地实现了两个线程互斥地访问临界资源(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 ); }; |
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
@.@ 我都是在Linux下面写程序,有好多东西可以用,嗯。
嗯,我在学操作系统,书里面的例子Win32 API,pthread都用,有时候我还得连其他机器。
我比较菜,也就是偶尔写点示范性的小程序,写不了啥实际的东西,功力不足啊!
有没有关于Linux下这方面的好书啊,推荐一下:)