问题描述
在进行收取家庭作业的并发测试是发现会有漏读数据的现象,在排除了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);
}