Ваш дизайн плохой. Поток должен содержать мьютекс только тогда, когда ему необходим доступ к разделяемым структурам данных. Это должна быть небольшая часть времени выполнения потока, а не подавляющее большинство его. Если вы видите модель, которую вы разрабатываете, пришло время изменить дизайн.
Один из возможных шаблонов состоит в том, чтобы вычислительный поток удерживал указатель на глобальные данные, пока он работает без удержания мьютекса. Поток пользовательского интерфейса может затем создать новую версию глобальных данных на основе ввода пользовательского интерфейса, а затем опубликовать указатель на новые данные, чтобы вычислительный поток увидел их при следующем получении указателя. Таким образом, вычислительный поток должен удерживать мьютекс только столько времени, сколько потребуется для копирования указателя.
Вот упрощенная схема для вычислительной нити:
pthread_mutex_lock(&mutex);
my_pointer = shared_pointer;
pthread_mutex_unlock(&mutex);
do_calculations();
А для потока пользовательского интерфейса логика выглядит следующим образом: вы изменяете копию данных. Вы делаете новую копию данных. Вы приобретаете мьютекс. Вы изменяете shared_pointer
, указывая на одну из двух копий данных. Вы удерживаете другую копию для изменения на следующем проходе.