Я разработал простое многопоточное приложение Python (Python 3.7) для вызова 8 различных ресурсоемких задач в 8 потоках.Задачи могут быть либо кодом Python, либо кодом C ++, который встроен в DLL и доступен через пакет ctypes.Я провожу эксперименты на 8-ядерном компьютере под Windows.
Странно, что когда все потоки вызывают код Python, кажется, что в определенный момент времени активен только один поток, а загрузка ЦП составляет около 12,5%.Но при вызове кода C ++ внутри DLL используются все ядра, а загрузка ЦП составляет 100%.
Теперь возникает вопрос: почему GIL (Global Interpreter Lock) не синхронизирует потоки Python, которые вызывают собственные коды C ++?Разве реализация ctypes освобождает GIL при вызове собственного кода C ++?
Edit 1: Никакой макрос, подобный Py_BEGIN_ALLOW_THREADS , используется в Native C ++ DLL.