我正在为多线程编程而苦苦挣扎......
我有一个通过 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 也会停止。直到 WaitForSingleObject(MutexMain) 失败后,DoHeartBeat 才会完成。
DoHeartBeat 是否在 MainThread 或 HeartBeatThread 的上下文中执行?它似乎在 MainThread 中执行。
我究竟做错了什么?有没有更好的办法?
谢谢,大卫