Синхронизация OpenSSL в многопоточных приложениях

Сегодня на работе пофиксил багу, связанную с зависанием при выходе из приложения. Реализация класса TLS сокетов иллюстрировала попытки разработчика впихнуть невпихуемое, но показать этот код я к сожалению не могу. Если кратко, были три основных метода Receive, Send и Close, работавшие из разных потоков. В каждом методе было по мьютексу, так как класс еще и обязан был поддерживать блокирующие и неблокирующие сокеты. Если бы использовался один мьютекс на весь класс, тогда блокирующий SSL_read мог бы заблочить все остальные потоки, когда те попытались бы записать данные или закрыть сокет.
Читать далее