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.
*/

См. также