System::Threading::Mutex class

Mutex class

Mutex implemnetation. Objects of this class should only be allocated using System::MakeObject() function. Never create instance of this type on stack or using operator new, as it will result in runtime errors and/or assertion faults. Always wrap this class into System::SmartPtr pointer and use this pointer to pass it to functions as argument.

class Mutex : public System::Threading::WaitHandle

Методы

МетодОписание
Mutex()Информация RTTI.
Mutex(bool)Конструктор.
Mutex(bool, const String&)Конструктор.
ReleaseMutex()Освобождает мьютекс.
static Remove(const String&)Удаляет именованный мьютекс из системы.
virtual Reset()Сбрасывает состояние мьютекса. Не реализовано.
virtual Set()Устанавливает мьютекс в состояние сигнала. Не реализовано.
WaitOne() overrideБлокирует мьютекс. Выполняет неограниченное ожидание, если необходимо.
WaitOne(int) overrideБлокирует мьютекс. Выполняет ожидание, если необходимо.
WaitOne(TimeSpan) overrideБлокирует мьютекс. Выполняет ожидание, если необходимо.

Поля

ПолеОписание
static WaitTimeoutОсобое значение, которое возвращается функцией, иначе возвращается индекс сигнального объекта в массиве, если тайм‑аут превышен и ничего не сигнализирует.

Примечания

#include "system/threading/mutex.h"
#include "system/threading/thread.h"
#include "system/console.h"
#include "system/convert.h"
#include "system/smart_ptr.h"
#include "system/string.h"

int main()
{
  auto mutex = System::MakeObject<System::Threading::Mutex>();

  System::String str;

  const int THREADS_COUNT = 3;
  std::vector<System::SharedPtr<System::Threading::Thread>> threads;
  threads.reserve(THREADS_COUNT);

  for (auto i = 0; i < THREADS_COUNT; ++i)
  {
    threads.push_back(System::MakeObject<System::Threading::Thread>([&mutex, &str]()
    {
      mutex->WaitOne();

      str += u"Thread " + System::Convert::ToString(System::Threading::Thread::GetCurrentThreadId()) + u" started." + System::Environment::get_NewLine();

      System::Threading::Thread::Sleep(200);

      str += u"Thread " + System::Convert::ToString(System::Threading::Thread::GetCurrentThreadId()) + u" ended." + System::Environment::get_NewLine();

      mutex->ReleaseMutex();
    }));

    threads[i]->Start();
  }

  System::Threading::Thread::Sleep(700);

  System::Console::WriteLine(str);

  return 0;
}
/*
This code example produces the following output:
Thread 1 started.
Thread 1 ended.
Thread 2 started.
Thread 2 ended.
Thread 3 started.
Thread 3 ended.
*/

См. также