DerivedThread.cpp
上传用户:jnsxzc
上传日期:2007-01-03
资源大小:25k
文件大小:2k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // DerivedThread.cpp: implementation of the CDerivedThread class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "TestLock.h"
  6. #include "DerivedThread.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. char CDerivedThread::g_szStringToUpdate[128];
  13. int  CDerivedThread::g_nWriteLockAccesses = 0;
  14. int  CDerivedThread::g_nReadLockAccesses = 0;
  15. //---------------------------------------------------------------------
  16. // run() - overrides run method of base class and provides the test for
  17. // read-write locking of a global string.
  18. //
  19. // Exceptions   : NONE
  20. // Return Codes : NONE
  21. //---------------------------------------------------------------------
  22. ///////////////////////////////////////////////////////////////////////
  23. void CDerivedThread::run()
  24. ///////////////////////////////////////////////////////////////////////
  25. {
  26. char szWriterMessage[64];
  27. char szReaderMessage[128];
  28. sprintf(szWriterMessage, "Last written by thread #%ld", m_lThreadId);
  29. sprintf(szReaderMessage, "Read by thread #%ld : ", m_lThreadId);
  30. int nReadMessageLen = strlen(szReaderMessage);
  31. if (m_bReader)
  32. {
  33. // 100-ms object test time so that write threads are not starved... 
  34. // this delay must be viewed "as other work done by thread"
  35. while (WaitForSingleObject(m_hShutdownEvent, 300) != WAIT_OBJECT_0)
  36. {
  37. // Reader thread functionality
  38. m_pcLock->lockRead();
  39. InterlockedIncrement((long *)&g_nReadLockAccesses);
  40. // read message from global string
  41. sprintf(&szReaderMessage[nReadMessageLen], "%s; Read Lock Accesses %d; Write Lock Accesses %d", 
  42. g_szStringToUpdate, g_nReadLockAccesses, g_nWriteLockAccesses);
  43. m_pcLock->unlockRead();
  44. // The list box should be protected by a mutex... but this is only a test app
  45. // Do NOT measure performance of read-write locks using this list box.
  46. m_pcListBox->AddString(szReaderMessage);
  47. }
  48. }
  49. else
  50. {
  51. // 1-ms object test time so that all write threads have a chance to access
  52. // resources... this delay must be viewed "as other work done by thread"
  53. while (WaitForSingleObject(m_hShutdownEvent, 20) != WAIT_OBJECT_0)
  54. {
  55. // Writer thread functionality
  56. m_pcLock->lockWrite();
  57. g_nWriteLockAccesses++;
  58. memset(g_szStringToUpdate, 0, strlen(g_szStringToUpdate));
  59. // copy writer message to global string
  60. strcpy(g_szStringToUpdate, szWriterMessage);
  61. m_pcLock->unlockWrite();
  62. }
  63. }
  64. }