加锁问题请教

dl_zzc 2017-11-17 11:12:55
	g_cs.Lock();
ret=0;
for (k=0; k<125; k++)
{
_stscanf(strProtocol.Mid(6+k*4,4), _T("%x"), &value);
if (value > 32767) value -= 0X10000;
m_data.d_zjka[n].d_yc[k]=(float)value;
}
g_cs.Unlock();

.........

这段代码是线程里的,当另一个线程读取m_data.d_zjka[n].d_yc[k]数据时,还需要加锁吗?
...全文
239 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2017-11-18
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
如果所有线程都是读的可以不用, 有读有写就需要
赵4老师 2017-11-17
  • 打赏
  • 举报
回复
zgl7903 2017-11-17
  • 打赏
  • 举报
回复
如果所有线程都是读的可以不用, 有读有写就需要
CT8100 2017-11-17
  • 打赏
  • 举报
回复
要~我觉得是个习惯问题,可以确保数据的安全,完整,就算没有其他线程操作,外衣有总是好的。
Eleven 2017-11-17
  • 打赏
  • 举报
回复
如果有其它线程也操作了这个数据的话,就需要加锁来同步~
dl_zzc 2017-11-17
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
如果所有线程都是读的可以不用, 有读有写就需要


if (zjka_1b.SJCL(strProtocol,8,0)==0)
{
m_data.d_zjka[8].tx=true;
if (m_data.m_txfs)
{
}
else
{
YC_DATA_BUF.aci_YC_BUF[3].mag.f = (float)(m_data.d_zjka[8].d_yc[3]/10.0); // 交流柜遥测量
YC_DATA_BUF.aci_YC_BUF[4].mag.f = (float)(m_data.d_zjka[8].d_yc[4]/10.0); // 交流柜遥测量
YC_DATA_BUF.aci_YC_BUF[5].mag.f = (float)(m_data.d_zjka[8].d_yc[5]/10.0); // 交流柜遥测量

YC_DATA_BUF.aci_YC_BUF[12].mag.f = (float)(m_data.d_zjka[8].d_yc[15]/10.0); // 交流柜遥测量
YC_DATA_BUF.aci_YC_BUF[13].mag.f = (float)(m_data.d_zjka[8].d_yc[16]/10.0); // 交流柜遥测量
YC_DATA_BUF.aci_YC_BUF[14].mag.f = (float)(m_data.d_zjka[8].d_yc[17]/10.0); // 交流柜遥测量
}
}
SendMessage(hViewWnd,WM_ZJKA51,0,0);

这是完整代码
其中首页的代码是zjka_1b.SJCL(strProtocol,8,0)里的;发送消息的后,消息处理函数也有读m_data.d_zjka[8]的地方,都没加锁,只有首页的地方加了锁的。
我个人感觉,各处都不用加锁的,不知是否正确?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧