首页 > 解决方案 > 在我的线程/原子值代码中找不到错误

问题描述

我正在使用CodeBlocksMinGW 编译器和 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,当接收到正确的响应消息时,并保存响应消息数据

我还有变量nSentMessagesand nReceivedMessages,它保存发送的消息数和接收的消息数。我最后检查这些值是否相同。通常,我不需要这个(因为我等待每个响应),我把它放在那里作为额外的安全措施。

现在进入问题:

1)我的问题出在回调函数notifyEvent()中,我大概将响应消息数据保存到容器中,但有时我仍然会得到“不在容器中!” 从那个 if 语句,我不知道为什么。(我的容器只是普通的 set set<EDSobject, cmp> container,它不是原子的或任何东西,因为我知道不会同时从不同的线程读取/写入它。)

2)如果你检查我的功能sendSDO(),有一条线Sleep(10)。该程序可以正常工作,但如果我删除它,程序会返回不同的值- 576nSentMessagesnReceivedMessages575。每次运行程序时都会发生这种情况,我不明白为什么。

标签: c++multithreadingatomic

解决方案


推荐阅读