Win32ThreadBarrier.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:3k
源码类别:

并行计算

开发平台:

Visual C++

  1. //
  2. // OpenThread library, Copyright (C) 2002 - 2003  The Open Thread Group
  3. //
  4. // This library is free software; you can redistribute it and/or
  5. // modify it under the terms of the GNU Lesser General Public
  6. // License as published by the Free Software Foundation; either
  7. // version 2.1 of the License, or (at your option) any later version.
  8. //
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. // Lesser General Public License for more details.
  13. // 
  14. // You should have received a copy of the GNU Lesser General Public
  15. // License along with this library; if not, write to the Free Software
  16. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17. //
  18. //
  19. // Win32Barrier.c++ - C++ Barrier class built on top of POSIX threads.
  20. // ~~~~~~~~~~~~~~~~~~
  21. //
  22. #include "../Barrier"
  23. #include "Win32BarrierPrivateData.h"
  24. using namespace OpenThreads;
  25. // so compiler can place it somewhere
  26. Win32BarrierPrivateData::~Win32BarrierPrivateData()
  27. {
  28. };
  29. //----------------------------------------------------------------------------
  30. //
  31. // Decription: Constructor
  32. //
  33. // Use: public.
  34. //
  35. Barrier::Barrier(int numThreads) {
  36.     Win32BarrierPrivateData *pd = new Win32BarrierPrivateData();
  37.     pd->cnt = 0;
  38.     pd->phase = 0;
  39.     pd->maxcnt = numThreads;
  40.     _prvData = static_cast<void *>(pd);
  41. }
  42. //----------------------------------------------------------------------------
  43. //
  44. // Decription: Destructor
  45. //
  46. // Use: public.
  47. //
  48. Barrier::~Barrier() {
  49.     Win32BarrierPrivateData *pd =
  50.         static_cast<Win32BarrierPrivateData*>(_prvData);
  51.     delete pd;
  52. }
  53. //----------------------------------------------------------------------------
  54. //
  55. // Decription: Reset the barrier to its original state
  56. //
  57. // Use: public.
  58. //
  59. void Barrier::reset() {
  60.     Win32BarrierPrivateData *pd =
  61.         static_cast<Win32BarrierPrivateData*>(_prvData);
  62.     pd->cnt = 0;
  63.     pd->phase = 0;
  64. }
  65. //----------------------------------------------------------------------------
  66. //
  67. // Decription: Block until numThreads threads have entered the barrier.
  68. //
  69. // Use: public.
  70. //
  71. void Barrier::block(unsigned int numThreads) {
  72.     Win32BarrierPrivateData *pd =
  73.         static_cast<Win32BarrierPrivateData*>(_prvData);
  74.     if(numThreads != 0) pd->maxcnt = numThreads;
  75.     int my_phase;
  76.     pd->lock.lock();
  77.     my_phase = pd->phase;
  78.     ++pd->cnt;
  79.     if (pd->cnt == pd->maxcnt) {             // I am the last one
  80. pd->cnt = 0;                         // reset for next use
  81. pd->phase = 1 - my_phase;            // toggle phase
  82. pd->cond.broadcast();
  83.     }else{ 
  84.     while (pd->phase == my_phase) {
  85. pd->cond.wait(&pd->lock);
  86. }
  87. }
  88.     pd->lock.unlock();
  89. }