Все более или менее знающие Python разработчики знают про такую жуткую вещь как GIL. Глобальный блокировщик всего процесса до тех пор пока Python выполняется в одном из потоков. Он даёт потоко-защищённость методами сравнимыми с садизмом, поскольку любая неявная блокировка в многопоточном приложении смерти подобна, всё что опиралось на параллельное выполнение, умирает в мучениях, раз за разом натыкаясь на блокировку GIL.
Известно что по сей день из-за этого скорбного факта программисты на C++ используют Python-обёртки по большей части лишь в однопоточных приложениях, а программисты на Python пытаются всех убедить, что им и так неплохо живётся.
Казалось бы, если поток порождён в C++, он не знает ни о каком GIL, используй Python без блокировок и радуйся. Радость разработчика однако закончится уже на втором потоке запросившем область глобальных переменных без блокировки.
Однако есть путь ведущий к светлому будущему!
Этот путь был изначально в таком языке как Perl, он же поддерживается в Си-API языка Python и я ума не приложу почему подобный механизм не включен в один из стандартных модулей Python! Способ по сути сводит использование различных под-интерпретаторов Python в разных потоках, причём используя свой GIL для каждого(!!!) без всякого шаманства и магии, просто последовательно вызвав несколько функций и стандартного набора Си-API языка Python!
Читать полностью »
Рубрика «многопоточность» - 8
QThread: Вы не делаете это неправильно
2013-01-25 в 12:42, admin, рубрики: multithreading, qt, Qt Software, qt4, qt5, QThread, многопоточность, переводы Эта статья об использовании QThread является ответом на другой пост «You're doing it wrong» («Вы делаете это неправильно»), опубликованный три года назад, моим коллегой в то время, Брэдом.
В своём посте Брэд рассказывает, что он видит, как многие пользователи наследуют класс QThread, добавляют несколько слотов и делают в конструкторе примерно так:
moveToThread(this);
Они перемещают поток сам в себя. Как говорит Брэд, это неправильно: QThread должен быть интерфейсом для управления потоком.
Читать полностью »
Демонстрация сбоев программы при отсутствии барьеров памяти
2012-10-20 в 20:35, admin, рубрики: c++, c++11, lock-free, mobile development, многопоточность, параллельное программирование, метки: c++11, lock-free, АРМ, многопоточность, параллельное программированиеДжефф Прешинг (Jeff Preshing) опубликовал отличную демонстрацию, как нормальный код C++ возвращает непредсказуемый результат на процессорах со слабо упорядоченной обработкой очереди запросов (Weakly-Ordered CPU), то есть на всех многоядерных ARM-процессорах. Например, на iPhone или каком-нибудь современном Android-устройстве.
Простая программа C++ с двумя потоками 20.000.000 раз прибавляет единичку к значению, защищённому мьютексом, — и каждый раз на выходе получается разный результат, который меньше 20.000.000!
Как говорится, наш враг — CPU.
Читать полностью »
Реализация синглтона в многопоточном приложении
2012-08-27 в 6:24, admin, рубрики: c++, gcc, MSVC, Компиляторы, многопоточность, Программирование, метки: c++, gcc, MSVC, компиляторы, многопоточность, Программирование
Введение
В настоящий момент сложно себе представить программное обеспечение, работающее в одном потоке. Конечно, существует ряд простых задач, для которых один поток более, чем достаточен. Однако так бывает далеко не всегда и большинство задач средней или высокой сложности так или иначе используют многопоточность. В этой статье я буду говорить об использовании синглтонов в многопоточной среде. Несмотря на кажущуюся простоту эта тема содержит множество нюансов и интересных вопросов, поэтому считаю, что она заслуживает отдельной статьи. Здесь не будет затрагиваться обсуждение того, зачем использовать синглтоны, а также как их правильно использовать. Для прояснения этих вопросов я рекомендую обратиться к моим предыдущим статьям, посвященным разным вопросам, связанным с синглтонами [1], [2], [3]. В этой статье речь будет идти о влиянии многопоточности на реализацию синглтонов и обсуждению вопросов, которые всплывают при разработке.
Читать полностью »
Библиотека OmniThreadLibrary — простая многопоточность в среде Delphi
2012-05-28 в 7:48, admin, рубрики: concurrency, Delphi, multithreading, Алгоритмы, многопоточность, Параллелизм, Программирование, разработка, синхронизация, метки: concurrency, Delphi, multithreading, Алгоритмы, многопоточность, Параллелизм, разработка, синхронизация Написать интересную статью на техническую тему очень сложно. Приходится балансировать между тем, чтобы не скатиться в технические дебри и тем, чтобы совсем ничего не сказать. Сегодня я попробую в общих словах (без деталей) поговорить о том, как обстоят дела с разработкой многопоточных desktop-приложений в не столь популярной на сегодняшний день, но наверняка знакомой многим российским разработчикам среде Delphi. Статья ориентирована на НЕ новичков в программировании, являющихся при этом новичками в области создания многопоточных приложений.
Читать полностью »
C++ / Каспийские монстры многопоточности
2012-02-15 в 11:05, admin, рубрики: многопоточность, очереди, С++, метки: многопоточность, очереди, С++
Мне очень хочется показать, что в многопоточности С++ «очень быстро» не исключает «очень безопасно». А значит можно писать эффективные и стабильные программы со сколь угодно большим количеством потоков и при этом избегать траты кучи времени на отладку многопоточности. Если Вам интересно, как мне удаётся не выстрелить себе в ногу, и чем я за это плачу, добро пожаловать
Когда лет 7-8 назад пришлось писать всё более многопоточные программы, мой друг — Капитан Очевидность — обратил моё внимание на следующий факт: чем больше потоков, чем активнее они взаимодействуют, тем больше требуется объектов синхронизации и тем большеЧитать полностью »