多线程编程之一:关键段的使用

来源:互联网 发布:软件代理赚钱吗 编辑:程序博客网 时间:2024/05/18 02:10

用下面这段代码说明多线程同步中“关键段”的使用:

#include "stdafx.h"#include <windows.h>#include <process.h>#include <iostream>using namespace::std;const int COUNT = 1000;int g_nSum = 0;CRITICAL_SECTION g_cs;unsigned int __stdcall FirstThread(PVOID pvParam){EnterCriticalSection(&g_cs);g_nSum = 0;for (int n = 1; n <= COUNT; n++){cout << "--------------add in FirstThread-------------\n" << endl;g_nSum += n;}LeaveCriticalSection(&g_cs);return(g_nSum);}unsigned int __stdcall SecondThread(PVOID pvParam){EnterCriticalSection(&g_cs);g_nSum = 0;for (int n = 1; n <= COUNT; n++){cout << "--------------add in SecondThread-------------\n" << endl;g_nSum += n;}LeaveCriticalSection(&g_cs);return(g_nSum);}int main(){InitializeCriticalSection(&g_cs); HANDLE h1, h2;h1 = (HANDLE)_beginthreadex(NULL, 0, FirstThread, NULL, 0, NULL);h2 = (HANDLE)_beginthreadex(NULL, 0, SecondThread, NULL, 0, NULL);WaitForSingleObject(h1, INFINITE);WaitForSingleObject(h2, INFINITE);cout << g_nSum << endl;DeleteCriticalSection(&g_cs);    return 0;}


转:所谓的“关键段”一般称为临界区,是实现进程内多线程互斥的常用方法。所谓“争夺关键段”就是一个线程以进入临界区(尚未离开),而又有其它线程要进入临界区。在首次发生“争夺”时,程序会自动创建一个内核事件,并等待该事件状态,当前一个线程离开临界区时会设置该事件通知正在等待的线程。若再次发生“争夺”,则利用前面已经创建的内核事件,无须再创建。等待和设置内核对象需要的时间较长,而很多情况下,线程间并不会出现“争夺关键段”的情况,所以利用临界区实现线程互斥比直接使用内核事件效率高。