进程进入临界区的调度原则是:
①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
④如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现“忙等”现象。
#include <windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;
DWORD WINAPI FuncProc3(LPVOID lpParameter);
DWORD WINAPI FuncProc4(LPVOID lpParameter);
int ctickets = 100;
CRITICAL_SECTION g_csA;
void main(void)
{
InitializeCriticalSection(&g_csA);
InitializeCriticalSection(&g_csB);
HANDLE thread1;
HANDLE thread2;
thread1 = CreateThread(NULL, 0, FuncProc3, NULL, 0, NULL);
thread2 = CreateThread(NULL, 0, FuncProc4, NULL, 0, NULL);
CloseHandle(thread1);
CloseHandle(thread2);
Sleep(4000);
DeleteCriticalSection(&g_csA);
DeleteCriticalSection(&g_csB);
system("pause");
}
DWORD WINAPI FuncProc3(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_csA);
//Sleep(100);
Sleep(1);
if(ctickets > 0)
{
cout<<"thread1 sell ticket: "<<ctickets--<<endl;
LeaveCriticalSection(&g_csA);
}else{
LeaveCriticalSection(&g_csA);
break;
}
}
return 0;
}
DWORD WINAPI FuncProc4(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_csA);
// Sleep(100);
Sleep(1);
if(ctickets > 0)
{
cout<<"thread2 sell ticket: "<<ctickets--<<endl;
}else{
break;
}
LeaveCriticalSection(&g_csA);
}
return 0;
}
上面这段代码如果把休眠时间改成0.1秒,则会报内存地址访问错误。
(开发环境:windows7、Microsoft Visual Studio 2008)
参考:http://baike.baidu.com/view/1237110.htm
1645

被折叠的 条评论
为什么被折叠?



