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

Métodos

MétodoDescripción
Mutex()Información RTTI.
Mutex(bool)Constructor.
Mutex(bool, const String&)Constructor.
ReleaseMutex()Libera el mutex.
static Remove(const String&)Elimina un mutex con nombre del sistema.
virtual Reset()Restablece el estado del mutex. No implementado.
virtual Set()Establece el mutex al estado señalado. No implementado.
WaitOne() overrideBloquea el mutex. Realiza una espera ilimitada si es necesario.
WaitOne(int) overrideBloquea el mutex. Realiza una espera si es necesario.
WaitOne(TimeSpan) overrideBloquea el mutex. Realiza una espera si es necesario.

Campos

CampoDescripción
static WaitTimeoutValor especial que debe ser devuelto por la función, de lo contrario devuelve el índice del objeto señalizado en el arreglo, si el tiempo de espera se supera y nada señala.

Observaciones

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

Ver también