Правильная многопоточность - напомним еще раз, что это такое

Звучит идеально, но что нужно для реальной многопоточности с соответствующими блокировками и для защиты вашей программы, чтобы она могла работать без сбоев, не беспокоясь о том, попадете ли вы когда-нибудь в тупик или состояние гонки?
Просто несколько блокировок, семафоры. , и много времени, чтобы все обдумать.

Я имею в виду, а как еще? Было бы безумием просить, чтобы он сам делал многопоточную безопасность. Мы можем начать с того, как вы должны заблокировать свою программу и предотвратить взаимоблокировки.

Что такое правильная многопоточность и как это сделать?

Необходимо достичь определенного потока программы, чтобы она работала без взаимоблокировок и потери данных. Тупиковые ситуации или состояния гонки могут возникать при одновременном доступе к общим ресурсам из нескольких потоков. Когда вы запускаете программу с многопоточностью, очень сложно отладить, что именно происходит, и какой поток имеет приоритет над другими потоками для доступа к общему ресурсу. Здесь вступают в игру блокировки, и мы используем их для предотвращения тех же самых взаимоблокировок.

Еще одна важная вещь, о которой следует упомянуть, - это переключение контекста, которое представляет собой процедуру, которой ЦП компьютера (центральный процессор) следует для перехода от одной задачи (или процесса) к другой, обеспечивая при этом что задачи не конфликтуют. Эффективное переключение контекста имеет решающее значение, если компьютер должен обеспечивать удобную для пользователя многозадачность.

Поговорим о замках подробнее.

Замки

Есть несколько разных замков:

Мьютексы и переменные условий

Мьютексы

Означает взаимное исключение и защищает общие ресурсы, которые используются несколькими потоками. Общие ресурсы должны быть защищены, чтобы быть уверенным, что данные, которые записываются / читаются, обрабатываются должным образом.

Проще говоря, может быть глобальная переменная, и к ней могут обращаться несколько потоков. Вы блокируете его, потому что один поток может писать, а другие читать из него, но это должно происходить в определенном порядке.

Пример

Есть много функций, связанных с элементами управления мьютексами, и вы можете просмотреть их все здесь для C ++. Большинство функций замков одинаковы на всех языках.

Переменные условия

Переменная условия позволяет любому количеству потоков ждать, пока другой поток сигнализирует об условии, и они могут начать работу.

Он использует unique_lock (поверх мьютекса) для блокировки потока при вызове одной из его функций ожидания. Поток остается заблокированным до тех пор, пока его не разбудит другой поток, который вызывает функцию уведомления для того же объекта condition_variable.

Он работает с мьютексом, и вы можете посмотреть все его функции здесь.

Заключение

Это был краткий обзор и напоминание о блокировке вашей программы мьютексами и условными переменными для достижения идеальной многопоточности.