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

原创 2008年10月02日 20:11:00
 

    昨天那个火车站售票系统存在线程同步上的问题,这在实际应用中是不能存在的,否则后果不堪设想,估计上次那个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. }

C++多线程实例之临界区同步

临界区的特点:非内核对象,只能在window下使用,linux下不能使用;只能在同一进程内的线程间使用,速度快。 互斥量特点:互斥量是内核对象,可以用于进程内也可以在进程间互斥,速度相对互斥量慢点,也...
  • Blues1021
  • Blues1021
  • 2015年03月22日 09:51
  • 1975

秒杀多线程第五篇---经典线程同步 关键段(临界区)CS

上一篇《秒杀多线程第四篇 一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。本文首先介绍下如何使用关键段,然后再深层次的分...
  • will130
  • will130
  • 2015年11月12日 21:24
  • 500

多线程同步-临界区(深入理解CRITICAL_SECTION)

深入理解CRITICAL_SECTION 临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解。在需要跟踪代码中的多线程处理的性能时,对  ...
  • zhang_sinner
  • zhang_sinner
  • 2015年02月10日 18:09
  • 2797

【Java】利用synchronized(this)完成线程的临界区

在《【Java】线程并发、互斥与同步》(点击打开链接)中利用了操作系统通过操作信号量控制的原始方法,完成了线程的互斥与同步,说句题外话,其实这个信号量的算法,是著名的迪杰斯特拉创造的,也就是数据结构、...
  • yongh701
  • yongh701
  • 2015年01月20日 20:15
  • 1588

C++ 临界区 多线程同步互斥

临界区(Critical Section) 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线 程进入后其他所...
  • lzg13541043726
  • lzg13541043726
  • 2014年07月17日 11:29
  • 7682

Delphi线程同步(临界区、互斥、信号量)

 http://www.cnblogs.com/xumenger/p/4450659.html *Delphi线程同步(临界区、互斥、信号量)   当有多个线程的时候,经常需...
  • hewusheng10
  • hewusheng10
  • 2016年10月08日 17:25
  • 1867

多线程(c++11)------线程同步

多线程能提高程序的效率,但同时也带来了相应的问题----数据竞争。当多个线程同时操作同一个变量时,就会出现数据竞争。出现数据竞争,一般会用临界区(Critical Section)、互斥量(Mutex...
  • u012085988
  • u012085988
  • 2014年03月29日 22:44
  • 1614

Java多线程 之 临界区、ThreadLocal(十)

1.临界区临界区就是在同一时刻只能有一个任务访问的代码区。在java中通常使用下面的方式来实现:synchronized(syncObject) { //critical section }...
  • fan2012huan
  • fan2012huan
  • 2016年06月29日 11:04
  • 3054

windows核心编程-关键段(临界区)线程同步

windows核心编程-关键段(临界区)线程同步 线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。 接下来我主要讲一下自己在学习windows核心编程中对于临界区线程同步方式的使用。 临界...
  • windows_nt
  • windows_nt
  • 2013年05月20日 23:54
  • 6272

【多线程开发】临界区死锁问题

最近在学习网络多线程编程时遇到的一个问题,就是使用临界区时,由于使用不当而触发的死锁。 表象就是 应用程序安全卡死,内存和CPU消耗没有变化;实质是:控制共享资源的临界区没有进行正确的释放。 解决过程...
  • sirria1
  • sirria1
  • 2016年03月31日 11:23
  • 905
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习-使用临界区进行线程同步--发布日期:2008-07-17 16:38
举报原因:
原因补充:

(最多只允许输入30个字)