转自:http://blog.sina.com.cn/s/blog_43eb83b90100gb4a.html
1.CriticalSection
CriticalSection是在控制台程序等非MFC程序中可直接使用的临界区。
基本手法是这样的:
CRITICAL_SECTIONg_cs;
InitializeCriticalSectio
EnterCriticalSection( &g_cs);
.......
LeaveCriticalSection( &g_cs);
........
DeleteCriticalSection( &g_cs);
程序例子如下:
// thread.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
int index=0;
int tickets=10;
CRITICAL_SECTION g_cs;
DWORD
DWORD
int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSectio
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
while(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"main thread is running"< <endl;
LeaveCriticalSection( &g_cs );
Sleep(10);
}
DeleteCriticalSection( &g_cs );
return 0;
}
DWORD
{
while(TRUE)
{
if(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"thread1 sell ticket:"< <tickets-- <<endl;
LeaveCriticalSection( &g_cs );
}
else
break;
}
return 0;
}
DWORD
{
while(TRUE)
{
if(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"thread2 sell ticket:"< <tickets-- <<endl;
LeaveCriticalSection( &g_cs );
}
else
break;
}
return 0;
}
2. CCriticalSection 是专门用在MFC程序里已经封装好的临界区类
Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。
比较CriticalSection,CCriticalSection不用initialize,使用也很方便。
//离开临界区
//离开临界区
下面举例说明临界区的伟大作用
.h
#include <iostream>
using namespace std;
#include <tchar.h>
#include <windows.h>
// ThreadTicket.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int index=0;
int tickets=10;
int _tmain(int argc, _TCHAR* argv[])
{
}
DWORD WINAPI Fun1Proc(
)
{
}
DWORD WINAPI Fun2Proc(
)
{
}
这种两线程交替售票问题,加上主线程输出那句,共3句话交替输出。
可输出时常出现
maithread1 sell ticthread2 sell ticn thread isrunninket:10
thread1 selket:9
thread2 sellg
main thread is rl ticket:8
thread1 ticket:7
thread2 unning
main thread sell ticket:6
thrsell ticket:5
thre is running
main tead1 sell ticket:4ad2 sell ticket:3
hread is running
m
thread1 sell tickthread2 sell tickeain thread is runnet:2
t:1
ing
Press any key to continue
文字输出不完整就跳到下一个线程的情况。需要用临界区
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
int index=0;
int tickets=10;
CRITICAL_SECTION g_cs;
DWORD
DWORD
int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSectio
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
while(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"main thread is running"< <endl;
LeaveCriticalSection( &g_cs );
Sleep(10);
}
DeleteCriticalSection( &g_cs );
return 0;
}
DWORD
{
while(TRUE)
{
if(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"thread1 sell ticket:"< <tickets-- <<endl;
LeaveCriticalSection( &g_cs );
}
else
break;
}
return 0;
}
DWORD
{
while(TRUE)
{
if(tickets>0)
{
EnterCriticalSection( &g_cs );
cout < <"thread2 sell ticket:"< <tickets-- <<endl;
LeaveCriticalSection( &g_cs );
}
else
break;
}
return 0;
}