昨天那个火车站售票系统存在线程同步上的问题,这在实际应用中是不能存在的,否则后果不堪设想,估计上次那个ATM取款机的问题就是由于线程同步引起的。今天看了视频第16讲,知道了互斥,事件等同步对象以及相应的同步函数是可以跨进程使用的,而且一般也是作为不同进程中线程的同步用的,当然在同一个线程中也是可以用的,但是使用稍显麻烦,使用临界区进行同一个进程中的线程同步则简单直观。下面使用临界区来消除卖票系统中的同步问题:
- #include <windows.h>
- #include <iostream>
- using namespace std;
- DWORD WINAPI Seller1(
- LPVOID lpParameter
- );
- DWORD WINAPI Seller2(
- LPVOID lpParameter
- );
- int numberTicket=100;
- CRITICAL_SECTION CriticalSection;
- int main()
- {
- HANDLE sellThread1;
- HANDLE sellThread2;
- sellThread1=CreateThread(NULL,0,Seller1,NULL,0,0);
- sellThread2=CreateThread(NULL,0,Seller2,NULL,0,0);
- CloseHandle(sellThread1);
- CloseHandle(sellThread2);
- if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
- 0x80000400) )
- return 1;
- Sleep(4000);
- return 0;
- }
- DWORD WINAPI Seller1(LPVOID lpParameter)
- {
- while(true)
- {
-
- EnterCriticalSection(&CriticalSection);
- if(numberTicket>0)
- {
- cout<<"Seller1 sell NO."<<numberTicket--<<" ticket."<<endl;
- }
- else
- break;
-
- LeaveCriticalSection(&CriticalSection);
- }
- return 0;
- }
- DWORD WINAPI Seller2(LPVOID lpParameter)
- {
- while(true)
- {
-
- EnterCriticalSection(&CriticalSection);
- if(numberTicket>0)
- {
- cout<<"Seller2 sell NO."<<numberTicket--<<" ticket."<<endl;
- }
- else
- break;
-
- LeaveCriticalSection(&CriticalSection);
- }
- return 0;
- }