Mutex
Mutex class hierarchy
A Mutex is used to synchronize the execution of threads, for example to protect the access to a shared resource.
The Mutex
methods cannot be called from interrupt service routines (ISR). In the current version of Mbed OS, if you attempt to use a mutex from within an ISR, it will treat that as a fatal system error, and you will see an error like this:
++ MbedOS Error Info ++
Error Status: 0x80020115 Code: 277 Module: 2
Error Message: Mutex lock failed
Location: 0x80026B3
Error Value: 0xFFFFFFFA
Current Thread: Id: 0x20004F54 Entry: 0x8002ABF StackSize: 0x1000 StackMem: 0x20004F98 SP: 0x2004FEF8
For more info, visit: https://armmbed.github.io/mbedos-error/?error=0x80020115
-- MbedOS Error Info --
If synchronization is required in ISR, consider using semaphores.
Note: Mbed OS uses the PlatformMutex class instead of the RTOS mutex for all drivers.
Mutex class reference
Public Member Functions | |
Mutex () | |
Create and Initialize a Mutex object. More... | |
Mutex (const char *name) | |
Create and Initialize a Mutex object. More... | |
void | lock () |
Wait until a Mutex becomes available. More... | |
bool | trylock () |
Try to lock the mutex, and return immediately. More... | |
bool | trylock_for (uint32_t millisec) |
Try to lock the mutex for a specified time. More... | |
bool | trylock_for (Kernel::Clock::duration_u32 rel_time) |
Try to lock the mutex for a specified time. More... | |
bool | trylock_until (uint64_t millisec) |
Try to lock the mutex until specified time. More... | |
bool | trylock_until (Kernel::Clock::time_point abs_time) |
Try to lock the mutex until specified time. More... | |
void | unlock () |
Unlock the mutex that has previously been locked by the same thread. More... | |
osThreadId_t | get_owner () |
Get the owner the this mutex. More... | |
~Mutex () | |
Mutex destructor. More... |
Mutex example
Use Mutex to protect printf().
/*
* Copyright (c) 2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
Mutex stdio_mutex;
Thread t2;
Thread t3;
void notify(const char *name, int state)
{
stdio_mutex.lock();
printf("%s: %d\n\r", name, state);
stdio_mutex.unlock();
}
void test_thread(void const *args)
{
while (true) {
notify((const char *)args, 0);
ThisThread::sleep_for(1000);
notify((const char *)args, 1);
ThisThread::sleep_for(1000);
}
}
int main()
{
t2.start(callback(test_thread, (void *)"Th 2"));
t3.start(callback(test_thread, (void *)"Th 3"));
test_thread((void *)"Th 1");
}
Note: C standard library Mutexes
The Arm C standard library already has Mutexes in place to protect the access to stdio
, so on the LPC1768 the above example is not necessary. On the other hand, the LPC11U24 does not provide default stdio
Mutexes, making the above example a necessity.
Note: Because of the mutexes in the Arm C standard library, you cannot use stdio
(printf
, putc
, getc
and so on), malloc
and new
in ISR.
Related content
- PlatformMutex API reference.