Это поможет улучшить ваш вопрос с помощью диаграммы временной последовательности.
В любом случае, после вашего описания проблема может быть в:
- некоторая библиотека не предназначена для многопоточного использования
- не все операции блокируются мьютексом (хорошее объяснение мьютекса можно найти здесь )
- приоритеты потока / процесса
- смешанные API синхронизации / асинхронности (то есть один параметр возвращается событием, а другой задается с помощью вызова функции)
Если ваша единственная проблема - это порядок, вы также можете попробовать улучшить свой API, например, используя порядковый номер или временную метку. Таким образом, ваш код может найти самое раннее событие.
Надеюсь, это поможет.