Я борюсь с многопоточным программированием...
У меня есть приложение, которое взаимодействует с внешним устройством через модуль CAN-USB. У меня приложение отлично разговаривает по CAN-шине, но есть требование, чтобы приложение каждую секунду передало сообщение «сердцебиение».
Похоже, это идеальное время для использования потоков, поэтому я создал поток, который просыпается каждую секунду и отправляет сердцебиение. Проблема, с которой я столкнулся, заключается в совместном использовании интерфейса CAN-шины. Такт должен быть отправлен только тогда, когда шина простаивает. Как поделиться ресурсом?
Вот псевдокод, показывающий, что у меня есть до сих пор:
TMainThread
{
Init:
CanBusApi =new TCanBusApi;
MutexMain =CreateMutex( "CanBusApiMutexName" );
HeartbeatThread =new THeartbeatThread( CanBusApi );
Execution:
WaitForSingleObject( MutexMain );
CanBusApi->DoSomething();
ReleaseMutex( MutexMain );
}
THeartbeatThread( CanBusApi )
{
Init:
MutexHeart =CreateMutex( "CanBusApiMutexName" );
Execution:
Sleep( 1000 );
WaitForSingleObject( MutexHeart );
CanBusApi->DoHeartBeat();
ReleaseMutex( MutexHeart );
}
Проблема, которую я вижу, заключается в том, что при вызове DoHeartBeat основной поток блокируется в ожидании MutexMain, как и ожидалось, но DoHeartBeat также останавливается. DoHeartBeat не завершается до тех пор, пока не истечет время ожидания WaitForSingleObject(MutexMain) из-за сбоя.
Выполняется ли DoHeartBeat в контексте MainThread или HeartBeatThread? Кажется, он выполняется в MainThread.
Что я делаю не так? Есть ли способ лучше?
Спасибо, Дэвид