Для начала давайте разберемся с проблемами, которые могут возникнуть. Проблемы параллелизма возникают когда выполнение программы выполняется в нескольких потоках одновременно. Из-за параллелизма процессы или потоки не обязательно выполняются независимо на разных физических процессорах, но чаще всего они чередуются на одном и том же физическом процессоре. Обратите внимание, что параллелизм может применяться как к процессу, так и к потоку. В следующих разделах слова «процесс» и «поток» используются как взаимозаменяемые. Параллелизм предназначен, прежде всего, для обеспечения многозадачности, однако, если не учитывать, что кусок вашего кода может быть вызван из нескольких потоков можно наткнуться на ряд проблем. В зависимости от последствий, проблемы вызванные параллелизмом, можно разделить на три типа:
- Состояние гонки/Race Condition: программа завершается с неверным результатом, возникающим в результате последовательного выполнения разными потоками.
- Deadlocks/ Дэдлоки: параллельные потоки ждут друг от друга необходимых ресурсов. В результате ни один из них не может продолжить свою работу.
- Ресурсное голодание: процессу постоянно отказывают в ресурсах, необходимых для выполнения его работы.
В частности, нашу задачу можно отнести к проблеме
Race Condition. Прежде чем углубиться в решения, давайте рассмотрим простой пример. Предположим, у нас есть функция fun withdraw(amount), которая выводит определенную сумму денег из баланса, если требуемая сумма меньше текущего баланса. В конце функция возвращает остаток баланса. Функция определяется следующим образом: