c++ - 在我的线程/原子值代码中找不到错误
问题描述
我正在使用CodeBlocks
MinGW 编译器和 wxWidgets 库。
我正在编写一个程序,通过发送消息(使用索引和子索引)并获取带有所述数据的响应消息,从微控制器读取一些数据。
我的计划是一个接一个地发送消息并等待响应消息,__atomic int variables__
以检查我何时收到响应消息。
这是我发送消息的功能:
typedef std::chrono::high_resolution_clock Clock;
void sendSDO(int index, int subindex)
{
int nSent = 0;
atomic_index.store(index);
atomic_subindex.store(subindex);
canOpenClient->SDORead(index, subindex);
auto start = Clock::now();
nSentMessages++;
nSent++;
Sleep(10);
while ((atomic_index.load() != 0) && (atomic_subindex.load() != 0))
{
auto t = chrono::duration_cast<chrono::milliseconds>(Clock::now() - start);
if(t.count() > 20)
{
if (nSent > 5)
{
MainFrame->printTxt("[LOG] response not received\n");
return;
}
atomic_index.store(index);
atomic_subindex.store(subindex);
canOpenClient->SDORead(index, subindex);
nSentMessages++;
nSent++;
start = Clock::now();
}
}
}
伪代码设置 atomic int 为我想要从微控制器读取的值的索引和子索引,然后向它发送消息SDORead()
,如果在 20 毫秒内没有收到响应,则再次发送消息,最多 5 次。
为了接收消息,我有__separate thread__
一个回调函数,当我从控制器获得响应消息时调用它:
void notifyEvent(unsigned char ev_type)
{
SDO_msg_t msg;
msg = canOpenClient->Cmd_CustomMessageGet(); //get response message
if(ev_type == CO_EVENT_SDO_READ)
{
if ((msg.index == atomic_index.load()) && (msg.subindex == atomic_subindex.load()))
{
//does stuff, like saves message data to set container
atomic_index.store(0);
atomic_subindex.store(0);
}
}
if (message data not in container)
printf("not in container!")
}
这里我将相同的 atomic int 值设置为 0,当接收到正确的响应消息时,并保存响应消息数据
我还有变量nSentMessages
and nReceivedMessages
,它保存发送的消息数和接收的消息数。我最后检查这些值是否相同。通常,我不需要这个(因为我等待每个响应),我把它放在那里作为额外的安全措施。
现在进入问题:
1)我的问题出在回调函数notifyEvent()
中,我大概将响应消息数据保存到容器中,但有时我仍然会得到“不在容器中!” 从那个 if 语句,我不知道为什么。(我的容器只是普通的 set set<EDSobject, cmp> container
,它不是原子的或任何东西,因为我知道不会同时从不同的线程读取/写入它。)
2)如果你检查我的功能sendSDO()
,有一条线Sleep(10)
。该程序可以正常工作,但如果我删除它,程序会返回不同的值- 576nSentMessages
和nReceivedMessages
575。每次运行程序时都会发生这种情况,我不明白为什么。
解决方案
推荐阅读
- python - Python多功能索引切片
- azure - 如何从 Azure 数据工厂 V2 在 ADLA 中执行 U-SQL 存储过程
- php - 将字符串转换为数组
- ios - iOS自定义滑块从两端删除最小和最大空间
- css - CSS @print 没有标题的页边距
- unit-testing - publish UT results (TRX) to azure devops
- python - 在 RPM 环境中管理 Python 模块
- javascript - 我们如何在javascript中检查会话
- wordpress - 有新帖子时显示气球通知
- c++ - 如何将一个数组值合并为一个整数c ++