The mutex module provides a primitive for maintaining mutually exclusive access.
This class represents a general purpose, recursive mutex.
Implemented using pthread_mutex
on Posix and CRITICAL_SECTION
on Windows.
import core.thread : Thread; class Resource { Mutex mtx; int cargo; this() shared @safe nothrow { mtx = new shared Mutex(); cargo = 42; } void useResource() shared @safe nothrow @nogc { mtx.lock_nothrow(); (cast() cargo) += 1; mtx.unlock_nothrow(); } } shared Resource res = new shared Resource(); auto otherThread = new Thread( { foreach (i; 0 .. 10000) res.useResource(); }).start(); foreach (i; 0 .. 10000) res.useResource(); otherThread.join(); assert (res.cargo == 20042);
Initializes a mutex object.
Initializes a mutex object and sets it as the monitor for obj
.
obj
must not already have a monitor.If this lock is not already held by the caller, the lock is acquired, then the internal counter is incremented by one.
Mutex.lock
does not throw, but a class derived from Mutex can throw. Use lock_nothrow
in nothrow @nogc
code.Decrements the internal lock count by one. If this brings the count to zero, the lock is released.
Mutex.unlock
does not throw, but a class derived from Mutex can throw. Use unlock_nothrow
in nothrow @nogc
code.If the lock is held by another caller, the method returns. Otherwise, the lock is acquired if it is not already held, and then the internal counter is incremented by one.
Mutex.tryLock
does not throw, but a class derived from Mutex can throw. Use tryLock_nothrow
in nothrow @nogc
code.
© 1999–2018 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/core_sync_mutex.html