Я отправлю это как ответ, так как он слишком длинный для комментариев.
Я не знаком с этой конкретной системой и проблемой, но есть много случаев, когда что-то не может быть безопасно доступно из многих потоков. Обычно это означает, что вам нужно перепроектировать свое приложение.
Один из возможных способов решения этой проблемы - добавить еще один поток, который обрабатывает все коммуникации с общим ресурсом. У вас может быть, например, очередь, в которой другие потоки передают «задачи» потоку GPIO, который затем выполняет эти задачи и возвращает результаты, если результаты ожидаются. Это ограничит общий ресурс одним потоком, в то время как вы по-прежнему сможете выполнять большую часть обработки данных в других потоках.
Это может не работать с вашим приложением по разным причинам.