您的位置:首页 > 编程语言

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

2017-07-27 21:35 190 查看
用下面这段代码说明多线程同步中“关键段”的使用:

#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;
}


转:所谓的“关键段”一般称为临界区,是实现进程内多线程互斥的常用方法。所谓“争夺关键段”就是一个线程以进入临界区(尚未离开),而又有其它线程要进入临界区。在首次发生“争夺”时,程序会自动创建一个内核事件,并等待该事件状态,当前一个线程离开临界区时会设置该事件通知正在等待的线程。若再次发生“争夺”,则利用前面已经创建的内核事件,无须再创建。等待和设置内核对象需要的时间较长,而很多情况下,线程间并不会出现“争夺关键段”的情况,所以利用临界区实现线程互斥比直接使用内核事件效率高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: