Класс mutex
Класс mutex представляет собой примитив синхронизации,
который используется для защиты общих данных от одновременного
доступа из нескольких потоков. Когда один поток захватывает
мьютекс, другие потоки, пытающиеся захватить тот же мьютекс,
блокируются до тех пор, пока первый поток не освободит его.
Класс не принимает параметров и не копируется. Для использования
класса необходимо подключить заголовочный файл <mutex>.
Основные методы класса: lock - блокирует мьютекс,
try_lock - пытается заблокировать мьютекс без ожидания,
unlock - освобождает мьютекс. После создания мьютекс
находится в разблокированном состоянии.
Синтаксис
#include <mutex>
std::mutex mtx;
mtx.lock();
// критическая секция
mtx.unlock();
Пример
Давайте рассмотрим простой пример защиты общей переменной от одновременного доступа из двух потоков:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
mutex mtx;
int counter = 0;
void increment()
{
for (int i = 0; i < 1000; i++)
{
mtx.lock();
counter++;
mtx.unlock();
}
}
int main()
{
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
cout << counter << endl;
return 0;
}
Результат выполнения кода:
2000
Пример
Давайте используем метод try_lock для неблокирующей
попытки захвата мьютекса:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
mutex mtx;
if (mtx.try_lock())
{
cout << "Lock acquired" << endl;
mtx.unlock();
}
else
{
cout << "Lock not acquired" << endl;
}
mtx.lock();
if (mtx.try_lock())
{
cout << "Lock acquired again" << endl;
mtx.unlock();
}
else
{
cout << "Lock not acquired" << endl;
}
mtx.unlock();
return 0;
}
Результат выполнения кода:
"Lock acquired"
"Lock not acquired"
Смотрите также
-
метод
lock,
который блокирует мьютекс -
метод
try_lock,
который пытается заблокировать мьютекс без ожидания -
метод
unlock,
который освобождает мьютекс -
класс
lock_guard,
который автоматически управляет блокировкой мьютекса