找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3725|回复: 0

模拟ATM取钱动作,不加锁可能为负数,加了锁就不会了

[复制链接]
发表于 2012-5-23 16:51:35 | 显示全部楼层 |阅读模式
  1. // test.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "../../include/ace/ACE.h"
  5. #include "../../include/ace/Log_Msg.h"
  6. #include "../../include/ace/Singleton.h"
  7. #include "../../include/ace/Null_Mutex.h"
  8. #include "../../include/ace/OS.h"
  9. #include "../../include/ace/Thread_Mutex.h"
  10. #include "../../include/ace/Global_Macros.h"
  11. #pragma comment( lib, "libace32.lib")
  12. class config_data
  13. {
  14. public:
  15.         config_data();
  16.         ~config_data();
  17.         void add();
  18. };
  19. config_data::config_data()
  20. {
  21.         ACE_DEBUG((LM_INFO, ACE_TEXT("[%M][%T][%t] load route: %s\n"), "config_data()"));
  22. }
  23. config_data::~config_data()
  24. {
  25.         ACE_DEBUG((LM_INFO, ACE_TEXT("[%M][%T][%t] load route: %s\n"), "~config_data()"));
  26. }
  27. void config_data::add()
  28. {
  29.         ACE_DEBUG((LM_INFO, ACE_TEXT("[%M][%T][%t] load route: %s\n"), "add()"));
  30. }
  31. typedef ACE_Singleton<config_data,ACE_Null_Mutex> GAME_CONFIG;
  32. ACE_Thread_Mutex  tableptr_storm_lock;
  33. #include "ace/Log_Msg.h"
  34. #include "ace/OS.h"
  35. #include "ace/Thread.h"
  36. #include "ace/Task.h"
  37. int num=0;
  38. class CommandHandler: public ACE_Task_Base
  39. {
  40. private:
  41.         static int nThreadNum;
  42. public:
  43.         virtual int svc(void)
  44.         {
  45.                 int nThreadID = 0;
  46.                 int i = 0;
  47.                 nThreadNum++;
  48.                 nThreadID = nThreadNum;
  49.                 ACE_DEBUG( (LM_INFO, ACE_TEXT("thread[%t] %d start\n"), nThreadID) );
  50.                 ACE_OS::sleep(1);
  51.                 while(i <= 100)
  52.                 {
  53.                         i++;
  54.                         ACE_OS::sleep(1);
  55.                         {
  56.                                 num++;
  57.                                
  58.                                 {
  59.                                         ACE_DEBUG( (LM_INFO, ACE_TEXT("thread[%t] num = %d \n"), num) );
  60.                                 }
  61.                         }
  62.                 }
  63.                 return nThreadID;
  64.         }
  65. };
  66. class CommandHandler1: public ACE_Task_Base
  67. {
  68. public:
  69.         virtual int svc(void)
  70.         {
  71.                 int nThreadID = 0;
  72.                 int i = 0;
  73.                 ACE_DEBUG( (LM_INFO, ACE_TEXT("thread[%t]  start\n")) );
  74.                 ACE_OS::sleep(1);
  75.                 while(i <= 100)
  76.                 {
  77.                        
  78.                         i++;
  79.                        
  80.                         {
  81.                                 ACE_GUARD_RETURN(ACE_Thread_Mutex,g,tableptr_storm_lock,-1);
  82.                                 int aa=num;
  83.                                 if(num>0)
  84.                                 {
  85.                                         ACE_OS::sleep(2);
  86.                                         num-=aa;
  87.                                 }
  88.                                
  89.                                
  90.                                         ACE_DEBUG( (LM_INFO, ACE_TEXT("--thread[%t] num = %d \n"), num) );
  91.                                
  92.                                
  93.                         }
  94.                         ACE_OS::sleep(1);
  95.                 }
  96.                 return nThreadID;
  97.         }
  98. };
  99. int CommandHandler::nThreadNum = 0;
  100. int _tmain(int argc, _TCHAR* argv[])
  101. {
  102.         GAME_CONFIG::instance()->add();
  103.         GAME_CONFIG::instance()->add();
  104.         ACE_DEBUG((LM_INFO, ACE_TEXT("[%M][%T][%t] load route: %s\n"), "test"));
  105.        
  106.         int nReturn = 0;
  107.         CommandHandler cmd;
  108.         CommandHandler1 cmd1;
  109.         nReturn = cmd.activate(THR_NEW_LWP|THR_JOINABLE,1);//存钱线程
  110. ACE_OS::sleep(1);
  111.         cmd1.activate(THR_NEW_LWP|THR_JOINABLE,20);//取钱线程,假设有20个人在不同的ATM机器上取
  112.         if(nReturn != 0)
  113.         {
  114.                 ACE_DEBUG( (LM_ERROR, ACE_TEXT("failed to active this thread[%d] %p\n"), nReturn, ACE_TEXT("active")) );
  115.                 return -1;
  116.         }
  117.         /*ACE_OS::sleep(10);
  118.         ACE_DEBUG( (LM_INFO, ACE_TEXT("Suspend this thread ......\n")) );
  119.         cmd.suspend();
  120.         ACE_OS::sleep(10);
  121.         ACE_DEBUG( (LM_INFO, ACE_TEXT("Resume this thread ......\n")) );
  122.         cmd.resume();*/
  123.         cmd.wait();
  124.         return 0;
  125. }
复制代码
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-2 17:48 , Processed in 0.016543 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表