Ответ 1
Если вы используете (или можете использовать) Python 3.4, есть новая функция для той же цели:
if (PyGILState_Check()) {
/* I have the GIL */
}
https://docs.python.org/3/c-api/init.html?highlight=pygilstate_check#c.PyGILState_Check
Возвращает 1, если текущий поток удерживает GIL и 0 в противном случае. Эта функция может быть вызвана из любого потока в любое время. Только если он инициализировал состояние потока Python и в настоящее время удерживает GIL, он вернется 1. Это в основном вспомогательная/диагностическая функция. Это может быть полезно, например, в контекстах обратного вызова или в функциях распределения памяти, зная, что GIL заблокирован, позволяет вызывающему пользователю выполнять чувствительные действия или иначе вести себя по-другому.
В python 2 вы можете попробовать что-то вроде следующего:
int PyGILState_Check2(void) {
PyThreadState * tstate = _PyThreadState_Current;
return tstate && (tstate == PyGILState_GetThisThreadState());
}
Кажется, что хорошо работает в тех случаях, которые я пробовал. https://github.com/pankajp/pygilstate_check/blob/master/_pygilstate_check.c#L9