Действительно сложная вещь в программировании

Добрый день, уважаемые читатели. Сегодня я бы хотел немного поговорить о многопоточном программирование, которое недаром считается довольно сложным.

Сегодня мне пришлось написать небольшое консольное приложение для расчёта некоторых показателей. Всё было крайне простым: легкая математика, данных не так много.

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

Какие же у меня были ошибки? Во-первых, это неправильная архитектура приложения. Если вы делаете программу, которая должна работать в несколько потоков, архитектура — это не просто «красота» кода. Нужно обязательно продумать, как потоки будут общаться между собой, какие данные они будут разделять между друг другом, и как будет происходить их взаимодействие.

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

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

Более совершенная архитектура для многопоточных приложений, по моему мнению — это модель «менеджер-работник». У нас есть ряд потоков (работников), которые могут что-то считать, или выполнять. Также у нас есть система сообщений. Она позволит менеджеру (главному потоку) и работникам обмениваться данными. У данного подхода нет каких-то серьезных минусов, о которых я знаю. Однако Message System трудна в реализации.

Вторая проблема, с которой я встретился — это Взаимная блокировка (deadlock). Данная проблема возникла благодаря плохой архитектуре приложения.

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

Как же разрабатывать многопоточные приложения? Наверное, без теории тут не обойтись. Поэтому обязательно покупайте толстую книгу по этой теме и осваивайте её.

Также существует ряд сниппетов и архитектурных приёмов, которые позволят избежать многих проблем.

Конечно же, современные языки тоже могут оказать помощь в разработке многопоточных приложений. В .NET 4 и .NET 4.5 появилось много вещей, помогающих в этой сфере.

Категории: Программирование

Метки: