【问题积累】C++ API与内部线程操作共享数据的方式

问题描述

在进行收取家庭作业的并发测试是发现会有漏读数据的现象,在排除了CnComm库在读取数据时丢数据的可能之后发现,SDK有时能收到4个数据,但是在API获取的数据时只有3条数据;
后来发现是数据共享时原子操作的问题。


解决方法:

使用 CRITICAL_SECTION 来实现数据同步:

/*******************************************************************************
* @name      : get_homework_list
* @brief     : 获取收取家庭作业信息缓存
* @parameter : None
* @return    : 返回上报举手信息的字符串指针
*******************************************************************************/
SERIALDLL_API char *get_homework_list(void)
{
    Com.Lock();
    string tmp_list = "[" + Com.dtq_rcmd_map["update_homework_list"] + "]";
    memset(rtmpbuf, 0, LISTSIZE);
    memcpy(rtmpbuf, tmp_list.c_str(), tmp_list.length());
    if(tmp_list.length() > 2)
        DLL_DEBUG("[ API ] get_homework_list: s_len:%d \n", tmp_list.length());
    Com.dtq_rcmd_map["update_homework_list"].clear();
    Com.Unlock();
    return rtmpbuf;
}
// 在类中实现
// CRITICAL_SECTION g_cs;                 // 申明
// ::InitializeCriticalSection(&g_cs);    // 初始化 (在构造函数中调用)
// ::DeleteCriticalSection(&g_cs);        // 初始化 (在析构函数中调用)
    void Lock(void)
    {
        ::EnterCriticalSection(&g_cs);
    }
    void Unlock(void)
    {
        ::LeaveCriticalSection(&g_cs);
    }
发布了5 篇原创文章 · 获赞 0 · 访问量 154

猜你喜欢

转载自blog.csdn.net/weixin_41892612/article/details/100029912