Windows 进程进入临界区的调度原则

来源:互联网 发布:java 多线程源码分析 编辑:程序博客网 时间:2024/05/17 09:34

进程进入临界区的调度原则是:

 ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。

 ②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。

 ③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。

 ④如果进程不能进入自己的临界区,则应让出 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

 

 

 

原创粉丝点击