C++ Mutex Lock

Конструктор копирования в C++ Программирование и разработка

C++ известен как один из самых быстрых языков программирования с хорошей производительностью, высокой точностью и адекватной системой управления памятью. Этот язык программирования также поддерживает одновременное выполнение нескольких потоков с разделением между ними нескольких ресурсов. В многопоточности поток должен выполнять только операцию чтения, которая не создает проблем, поскольку на поток не влияет то, что в это время делают другие потоки. Но если эти потоки должны были разделить ресурсы между собой, один поток может изменить данные в то время, что создает проблему. Чтобы решить эту проблему, у нас есть «мьютекс» C++, который предотвращает доступ нескольких ресурсов к нашему коду/объекту, обеспечивая синхронизацию, в которой говорится, что доступ к объекту/коду может быть предоставлен только одному потоку одновременно,

Процедура

Мы узнаем, как мы можем остановить доступ нескольких потоков к объекту одновременно, используя блокировку мьютекса. Мы поговорим о синтаксисе блокировки мьютекса, о том, что такое многопоточность и как мы можем решать проблемы, вызванные многопоточностью, используя блокировку мьютекса. Затем мы возьмем пример многопоточности и реализуем для них блокировку мьютекса.

Синтаксис

Если мы хотим узнать, как мы можем реализовать блокировку мьютекса, чтобы предотвратить одновременный доступ нескольких потоков к нашему объекту или коду, мы можем использовать следующий синтаксис:

$ std:: mutex mut_x

$ mut_x. lock ();

Void func_name () {

// code we want to hide from the multiple threads would be written here

$ mut_x. unlocks ();

}

Теперь мы будем использовать этот синтаксис в фиктивном примере и в псевдокоде (который мы не можем просто запустить в редакторе кода), чтобы вы знали, как именно мы можем использовать этот синтаксис, как указано ниже:

$ std :: mutex mut_x

Void block () {

$ mut_x. lock ();

$ std :: cout << “hello”;

$ mut_x. unlocks ();

}

Пример

В этом примере попробуем сначала создать многопоточную операцию, а затем окружить эту операцию блокировкой и разблокировкой мьютекса, чтобы обеспечить синхронизацию операции с созданным кодом или объектом. Mutex имеет дело с условиями гонки, которые представляют собой значения, которые совершенно непредсказуемы и зависят от переключения потоков, которые учитывают время. Чтобы реализовать пример для мьютекса, нам сначала нужно импортировать важные и необходимые библиотеки из репозиториев. Требуемые библиотеки:

# include <iostream>

# include <thread>

# include <mutex>

Библиотека «iostream» предоставляет нам функцию для отображения данных как Cout, чтения данных как Cin и завершения оператора как endl. Мы используем библиотеку «потоков», чтобы использовать программы или функции из потоков. Библиотека «mutex» позволяет реализовать в коде как блокировку, так и разблокировку мьютекса. Мы используем «# include», потому что это позволяет включать все программы, связанные с библиотекой, в код.

Теперь, после выполнения предыдущего шага, мы определяем класс мьютекса или глобальную переменную для мьютекса, используя метод std. Затем мы создаем функцию для блокировки и разблокировки мьютекса, которую мы можем вызвать позже в коде. В этом примере мы называем эту функцию блоком. В теле функции блока мы сначала вызываем «mutex.lock()» и начинаем писать логику кода.

mutex.lock() запрещает другим потокам доступ к нашему созданному объекту или коду, так что только один поток может читать наш объект одновременно. В логике мы запускаем цикл for, который работает с индексом от 0 до 9. Мы отображаем значения в цикле. Как только эта логика создается в замке мьютекса после завершения его работы или после выхода из логики, мы вызываем метод «mutex.unlock()». Этот вызов метода позволяет нам разблокировать созданный объект от блокировки мьютекса, поскольку доступ объекта к одному единственному потоку был предоставлен ранее и после того, как операция над этим объектом выполняется одним потоком за один раз. Теперь мы хотим, чтобы другие потоки также имели доступ к этому объекту или коду. В противном случае, наш код перемещается в ситуацию «тупика», из-за которой созданный объект с мьютексом навсегда остается в заблокированной ситуации, и никакой другой поток не сможет получить доступ к этому объекту. Следовательно, незавершенная операция продолжает выполняться. После этого выходим из функции блока и переходим к главной.

В основном мы просто отображаем наш созданный мьютекс, создавая три потока, используя «std::thread thread_name (вызывая здесь уже созданную функцию блока, в которой мы создали мьютекс)» с именами thread1, thread2 и thread3 и т. д. Таким образом создаются три потока. Затем мы объединяем эти три потока для одновременного выполнения, вызывая файл «thread_name. присоединиться ()». И затем, мы возвращаем значение, равное нулю. Ранее упомянутое объяснение примера реализовано в виде кода, который можно показать на следующем рисунке:

В основном мы просто отображаем наш созданный мьютекс

В выводе кода мы видим выполнение и отображение всех трех потоков один за другим. Мы можем видеть, даже если наше приложение подпадает под категорию многопоточности. Тем не менее, ни один из потоков не перезаписал или не изменил данные и не поделился измененным ресурсом из-за реализации мьютекса «функционального блока».

Заключение

В этом руководстве дается подробное объяснение концепции функции мьютекса, используемой в C++. Мы обсудили, что такое многопоточные приложения, с какими проблемами приходится сталкиваться в многопоточных приложениях и почему нам необходимо реализовать мьютекс для многопоточных приложений. Затем мы обсудили синтаксис мьютекса на фиктивном примере с использованием псевдокода. Затем мы реализовали полный пример многопоточных приложений с мьютексом в Visual Studio C++.

Читайте также:  Примеры конкатенации строк Python
Оцените статью
bestprogrammer.ru
Добавить комментарий