进程死锁
进程死锁问题:
- 哲学家进餐的问题
- 线程1拥有了临界区对象A,等待临界区对象B的拥有权,线程2拥有了临界区对象B,等待临界区对象A的拥有权,就造成了死锁
#include<windows.h> #include<iostream.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter //thread data ); DWORD WINAPI Fun2Proc( LPVOID lpParameter //thread data ); int tickets=100; HANDLE g_hEvent;//保存创建的事件对象的句柄 CRITICAL_SECTION g_csA;//创建临界区对象 CRITICAL_SECTION g_csB;//创建临界区对象 void main() { HANDLE hThread1,hThread2; hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); InitializeCriticalSection(&g_csA);//initializes a critical section object InitializeCriticalSection(&g_csB);//initializes a critical section object Sleep(4000); DeleteCriticalSection(&g_csA);// releases all resources used by an unowned critical section object DeleteCriticalSection(&g_csB);// releases all resources used by an unowned critical section object } //线程1实现代码 DWORD WINAPI Fun1Proc( LPVOID lpParameter // thread data ) { while(TRUE) { EnterCriticalSection(&g_csA);//判断临界区的所有权是否被占用,如果未被占用则可以进入被保护代码段 Sleep(1);//休眠1毫秒,即放弃cpu的执行所有权,cpu转而执行线程2 EnterCriticalSection(&g_csB);//判断临界区的所有权是否被占用,如果未被占用则可以进入被保护代码段 if(tickets>0) { Sleep(1); cout<<"thread 1 sell ticket:"<<tickets--<<endl; } else break; //这里注意得将临界区释放,否则线程2将无法得到执行的机会 LeaveCriticalSection(&g_csB);// releases ownership of the specified critical section object LeaveCriticalSection(&g_csA);// releases ownership of the specified critical section object } return 0; } //线程2实现代码 DWORD WINAPI Fun2Proc( LPVOID lpParameter // thread data ) { while(TRUE) { EnterCriticalSection(&g_csB);//判断临界区的所有权是否被占用,如果未被占用则可以进入被保护代码段 Sleep(1);//休眠1毫秒,即放弃cpu的执行所有权,cpu转而执行线程1 EnterCriticalSection(&g_csA);//判断临界区的所有权是否被占用,如果未被占用则可以进入被保护代码段 if(tickets>0) { Sleep(1); cout<<"thread 2 sell ticket:"<<tickets--<<endl; } else break; LeaveCriticalSection(&g_csA);// releases ownership of the specified critical section object LeaveCriticalSection(&g_csB);// releases ownership of the specified critical section object } return 0; } /* 在线程1中,EnterCriticalSection(&g_csA)进程1取得临界区A的执行所有权,,当执行到sleep(1)时停止执行1毫秒, cpu转而执行线程2,EnterCriticalSection(&g_csB),判断临界区B是否被占用,未被占用则取得临界区B的执行所有权, 运行到sleep(1)是,cpu转而执行线程1,EnterCriticalSection(&g_csB)发现此时临界区被占用,进入等待状态,cpu调用线程2, 接着执行EnterCriticalSection(&g_csA)发现临界区A被占用,进入等待状态,此时进入死锁状态。 */