System::Threading::Monitor فئة

Monitor class

فئة Monitor توفر آلية تُزامن الوصول إلى الكائنات.

class Monitor : public System::Object

الطرق

طريقةالوصف
static Enter(const SharedPtr<Object>&)يستحوذ على قفل حصري على كائن محدد.
static Enter(const System::SharedPtr<Object>&, bool&)يستحوذ على قفل حصري على الكائن المحدد، ويضبط قيمةً ذريةً تشير إلى ما إذا تم أخذ القفل.
static Exit(const SharedPtr<Object>&)يفرج عن قفل حصري على الكائن المحدد.
static IsEntered(const System::SharedPtr<Object>&)يحدد ما إذا كان الخيط الحالي يمتلك القفل على الكائن المحدد.
static Pulse(const SharedPtr<Object>&)يُخطر خيطًا في طابور الانتظار بتغيير في حالة الكائن المقفل غير مُنفّذ.
static PulseAll(const SharedPtr<Object>&)يُخطر جميع الخيوط المنتظرة بتغيير في حالة الكائن غير مُنفّذ.
static TryEnter(const SharedPtr<Object>&)محاولات للحصول على قفل حصري على الكائن المحدد غير مُنفّذ.
static TryEnter(const System::SharedPtr<Object>&, bool&)محاولات للحصول على قفل حصري على الكائن المحدد، وتضبط قيمةً ذريةً تشير إلى ما إذا تم أخذ القفل.
static TryEnter(const SharedPtr<Object>&, int32_t)محاولات، للعدد المحدد من الملليثانية، للحصول على قفل حصري على الكائن المحدد غير مُنفّذ.
static TryEnter(const SharedPtr<Object>&, TimeSpan)محاولات، للمدة المحددة من الوقت، للحصول على قفل حصري على الكائن المحدد غير مُنفّذ.
static TryEnter(const System::SharedPtr<Object>&, int32_t, bool&)يحاول، لمدة الوقت المحدد، الحصول على قفل حصري على الكائن المحدد، ويضبط قيمةً بصورة ذرية تشير إلى ما إذا تم أخذ القفل.
static TryEnter(const System::SharedPtr<Object>&, TimeSpan, bool&)يحاول، لمدة الوقت المحدد، الحصول على قفل حصري على الكائن المحدد، ويضبط قيمةً بصورة ذرية تشير إلى ما إذا تم أخذ القفل.
static Wait(const SharedPtr<Object>&, int32_t, bool)يفرج القفل عن كائن ويوقف الخيط الحالي حتى يستعيد القفل. إذا انقضى الفاصل الزمني المحدد للمهلة، ينتقل الخيط إلى طابور الجاهزية. يمكن اختياريًا الخروج من نطاق المزامنة للسياق المتزامن قبل الانتظار واستعادة النطاق بعد ذلك. غير مُطبق.
static Wait(const SharedPtr<Object>&, TimeSpan, bool)يفرج القفل عن كائن ويوقف الخيط الحالي حتى يستعيد القفل. إذا انقضى الفاصل الزمني المحدد للمهلة، ينتقل الخيط إلى طابور الجاهزية. يمكن اختياريًا الخروج من نطاق المزامنة للسياق المتزامن قبل الانتظار واستعادة النطاق بعد ذلك. غير مُطبق.
static Wait(const SharedPtr<Object>&, int32_t)يفرج القفل عن كائن ويوقف الخيط الحالي حتى يستعيد القفل. إذا انقضى الفاصل الزمني المحدد للمهلة، ينتقل الخيط إلى طابور الجاهزية. غير مُطبق.
static Wait(const SharedPtr<Object>&, TimeSpan)يفرج القفل عن كائن ويوقف الخيط الحالي حتى يستعيد القفل. إذا انقضى الفاصل الزمني المحدد للمهلة، ينتقل الخيط إلى طابور الجاهزية. غير مُطبق.
static Wait(const SharedPtr<Object>&)يفرج القفل عن كائن ويوقف الخيط الحالي حتى يستعيد القفل غير مُطبق.

ملاحظات

#include "system/threading/monitor.h"
#include "system/threading/thread.h"
#include "system/smart_ptr.h"
#include "system/string.h"
#include <iostream>
#include <vector>

int main()
{
  using namespace System::Threading;

  const auto threadsCount = 3;
  std::cout << "Threads count: " << threadsCount << std::endl;
  auto locker = System::MakeObject<System::Object>();
  int x = 0;

  std::vector<System::SharedPtr<Thread>> threads;
  threads.reserve(threadsCount);
  for (auto i = 0; i < threadsCount; ++i)
  {
    threads.emplace_back(System::MakeObject<Thread>([&x, &locker]() -> void {
      Monitor::Enter(locker);

      x = 1;
      for (auto i = 0; i < 5; ++i)
      {
        std::cout << Thread::get_CurrentThread()->get_Name() << ": " << x++ << std::endl;
        Thread::Sleep(100);
      }

      Monitor::Exit(locker);
    }));
    threads.back()->set_Name(System::String("Thread " + std::to_string(i)));
    threads.back()->Start();
  }

  Thread::Sleep(threadsCount * 100);

  for (auto& thread : threads)
  {
    thread->Join();
  }

  return 0;
}
/*
This code example produces the following output:
Threads count: 3
Thread 0: 1
Thread 0: 2
Thread 0: 3
Thread 0: 4
Thread 0: 5
Thread 1: 1
Thread 1: 2
Thread 1: 3
Thread 1: 4
Thread 1: 5
Thread 2: 1
Thread 2: 2
Thread 2: 3
Thread 2: 4
Thread 2: 5
*/

انظر أيضًا