多线程学习-使用临界区进行线程同步--发布日期:2008-07-17 16:38

来源:互联网 发布:淘宝 女装的退款率 编辑:程序博客网 时间:2024/06/15 17:25
 

    昨天那个火车站售票系统存在线程同步上的问题,这在实际应用中是不能存在的,否则后果不堪设想,估计上次那个ATM取款机的问题就是由于线程同步引起的。今天看了视频第16讲,知道了互斥,事件等同步对象以及相应的同步函数是可以跨进程使用的,而且一般也是作为不同进程中线程的同步用的,当然在同一个线程中也是可以用的,但是使用稍显麻烦,使用临界区进行同一个进程中的线程同步则简单直观。下面使用临界区来消除卖票系统中的同步问题:

 

  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4. DWORD WINAPI Seller1(
  5.    LPVOID lpParameter
  6. );
  7. DWORD WINAPI Seller2(
  8.    LPVOID lpParameter
  9. );
  10. int numberTicket=100;
  11. // Global variable
  12. CRITICAL_SECTION CriticalSection;
  13. int main()
  14. {
  15. HANDLE sellThread1;
  16. HANDLE sellThread2;
  17. sellThread1=CreateThread(NULL,0,Seller1,NULL,0,0);
  18. sellThread2=CreateThread(NULL,0,Seller2,NULL,0,0);
  19. CloseHandle(sellThread1);
  20. CloseHandle(sellThread2);
  21. // Initialize the critical section one time only.
  22.      if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
  23.          0x80000400) )
  24.          return 1;
  25. Sleep(4000);
  26. return 0;
  27. }
  28. DWORD WINAPI Seller1(LPVOID lpParameter)
  29. {
  30. while(true)
  31. {
  32.      // Request ownership of the critical section.
  33.          EnterCriticalSection(&CriticalSection);
  34. if(numberTicket>0) //票还没售完
  35. {
  36. cout<<"Seller1 sell NO."<<numberTicket--<<" ticket."<<endl;
  37. }
  38. else
  39. break;
  40.          // Release ownership of the critical section.
  41.          LeaveCriticalSection(&CriticalSection);
  42. }
  43. return 0;
  44. }
  45. DWORD WINAPI Seller2(LPVOID lpParameter)
  46. {
  47. while(true)
  48. {
  49.       // Request ownership of the critical section.
  50.          EnterCriticalSection(&CriticalSection);
  51. if(numberTicket>0) //票还没售完
  52. {
  53. cout<<"Seller2 sell NO."<<numberTicket--<<" ticket."<<endl;
  54. }
  55. else
  56. break;
  57.           // Release ownership of the critical section.
  58.          LeaveCriticalSection(&CriticalSection);
  59. }
  60. return 0;
  61. }

原创粉丝点击