更新时间:2016-06-17 00:34:34浏览次数:1+次
CRITICAL_SECTION g_cs;
然后我们在主线程开始后初始化一下这个结构体,调用函数InitializeCriticalSection,代码如下:InitializeCriticalSection(&g_cs);
然后在要操作公共资源的代码前加上:EnterCriticalSection(&g_cs);
在操作公共资源结束后的加上:LeaveCriticalSection(&g_cs);
这样就可以了。比如添加任务的时候,我们的代码如下:EnterCriticalSection(&g_cs);//进入保护状态
g_tasklist.push_back(0);
g_tasklist.push_back(0);
LeaveCriticalSection(&g_cs);//退出保护状态
进入保护状态后,操作g_tasklist不会被其他线程干扰而导致共享资源操作错误。需要注意的是,一个线程执行了EnterCriticalSection(&g_cs)后,只要还没有执行LeaveCriticalSection(&g_cs),其他线程执行EnterCriticalSection(&g_cs)时就被堵住了,无法向后执行。等退出了保护状态,其他线程才可以突破EnterCriticalSection(&g_cs)的阻碍。正是因为这个可以阻碍其他线程,所以,你最好只在公共资源操作的时候加上保护,其他代码就不要放在中间,否则阻碍了其他线程的执行,就会降低效率了。#include <Windows.h>
#include <iostream>
#include <vector>
using namespace std;
CRITICAL_SECTION g_cs;
vector<int> g_tasklist;
void TaskProc(int i)
{
cout<<"线程"<<i<<"正在";
cout<<"假装处理任务,并且很快处理完了一个,剩余任务数:"<<g_tasklist.size()<<endl;
}
DWORD WINAPI ThreadPoolProc(LPVOID lpParam)
{
while(1)
{
EnterCriticalSection(&g_cs);
if (g_tasklist.size()<=0)
{
LeaveCriticalSection(&g_cs);
cout<<"没有可处理任务,线程"<<*(int*)lpParam<<"开始休眠\n";
Sleep(5000);
}
else
{
g_tasklist.pop_back();
LeaveCriticalSection(&g_cs);
TaskProc(*(int*)lpParam);
Sleep(1000);
}
}
}
void main()
{
HANDLE hThread[5]={0};
DWORD dwThreadID[5]={0};
static int id[5];
for (int i=0;i<5;i++)
{
id[i]=i;
hThread[i]=CreateThread(NULL,0,ThreadPoolProc,&id[i],0,&dwThreadID[i]);
}
InitializeCriticalSection(&g_cs);
while(1)
{
EnterCriticalSection(&g_cs);
g_tasklist.push_back(0);
g_tasklist.push_back(0);
LeaveCriticalSection(&g_cs);
cout<<"新增2个任务.\n";
Sleep(2000);
}
}
相关资讯