本文主要是介绍多线程学习-使用临界区进行线程同步--发布日期:2008-07-17 16:38,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
昨天那个火车站售票系统存在线程同步上的问题,这在实际应用中是不能存在的,否则后果不堪设想,估计上次那个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;
- }
|
这篇关于多线程学习-使用临界区进行线程同步--发布日期:2008-07-17 16:38的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!