今天复习了一下操作系统的一些知识,做了一争夺个临界区资源死锁的实现,下面是实验的源代码.
#include<iostream.h> #include<windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ); DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ); int tickets = 100; CRITICAL_SECTION g_csA; CRITICAL_SECTION g_csB; void main() { HANDLE hThread1; HANDLE hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); InitializeCriticalSection(&g_csA); InitializeCriticalSection(&g_csB); Sleep(4000); DeleteCriticalSection(&g_csB); DeleteCriticalSection(&g_csA); } DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ) { while(TRUE) { EnterCriticalSection(&g_csA); Sleep(1); EnterCriticalSection(&g_csB); // EnterCriticalSection(&g_cs);//判断能否得到临界区对象所有权 if(tickets > 0) { Sleep(1); cout<<"thread1 sell tickets"<<tickets--<<endl; } else break; // LeaveCriticalSection(&g_cs); LeaveCriticalSection(&g_csB); LeaveCriticalSection(&g_csA); } return 1; } DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ) { while(TRUE) { EnterCriticalSection(&g_csB); Sleep(1); EnterCriticalSection(&g_csA); // EnterCriticalSection(&g_cs); if(tickets > 0) { Sleep(1); cout<<"thread2 sell tickets"<<tickets--<<endl; } else break; // LeaveCriticalSection(&g_cs); LeaveCriticalSection(&g_csA); LeaveCriticalSection(&g_csB); } return 1; }
在学校时,这一部分知识我还是掌握得不错的.不过当时没有做过这个实验,现在补做一下.
做实验与看理论比起来真的是轻松了许多.当然上面的有一些代码是可以删除的.因为没有影响,所以就放着了.