全局变量 一个线程写数据 多个线程多个地方读 要不要加锁? 不加锁会不会有问题?

dl551djs 2011-03-14 11:04:21
如题,我朋友说这个没问题,多个写才要加锁,防止数据乱了。

但我认为这样的可能会出问题,但也是没有充分的自信。我的理由是 当写到一半的时候,然后别的线程开始读了,就会把数据读乱了。

不知这样对不对?

如果不加锁,会不会造成系统死机? 现在我没有条件试验 ,谁能试下,看看N多个线程读一个全局结构体里的多个变量值,然后一个线程不断的刷新写入的数据,看读入会不会出错?

我写入用的是仅一个赋值(让结构体赋值给结构体),这样是否读数据会出错?

我举个例:比如写入结构体A= tempA; 然后,读A.a A.b A.c等等,会不会出现有些数据正好被赋值一半的情况?

求解。
...全文
1368 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArcRain 2011-03-15
  • 打赏
  • 举报
回复
用信号量通知的方式来响应还是及时的。
dl551djs 2011-03-15
  • 打赏
  • 举报
回复

感谢这么多热心回答的,分析的也很详细,

另外再问下 :

信号量的方式 响应怎么样 比while查询方式不会慢很多吧?
airmanisvip 2011-03-15
  • 打赏
  • 举报
回复
要加锁
aiwnx 2011-03-15
  • 打赏
  • 举报
回复 1
多个读进程间可以不用加锁,但读进程和写进程之间需要加锁
Eleven 2011-03-15
  • 打赏
  • 举报
回复
多个线程,有读有写肯定要是加锁的
lazy_2010 2011-03-15
  • 打赏
  • 举报
回复 1
需要加锁,结构体的赋值,实际上是调用 memcpy 进行实现的,可能在写到一半的时候,另外的线程来读取,导致问题,但是这样的代码原则上不会导致死机,只会导致逻辑错误,与预期不同。
Dreadnought 2011-03-15
  • 打赏
  • 举报
回复
要滴…
天山游龙 2011-03-15
  • 打赏
  • 举报
回复
要安全,要加锁的!
qman007 2011-03-15
  • 打赏
  • 举报
回复
典型的读写锁,unix/linux下有api可以直接使用,
windows下只有NT6.0以上的版本才有api(vista/2008/7,不包括xp)
青稞 2011-03-15
  • 打赏
  • 举报
回复
只读的话,不需要加锁.
但有读写交互的话,就要加锁.
Bit_bbtt 2011-03-15
  • 打赏
  • 举报
回复
需要加锁
ArcRain 2011-03-14
  • 打赏
  • 举报
回复
会有可能出问题的,我也觉得需要加锁。
可以考虑读写共享缓冲区数组的现象,读写公共数据变量如果不加锁的话,数据的有效性和正确性是很难把握的。
wltg2001 2011-03-14
  • 打赏
  • 举报
回复
我觉得是要加锁的。

15,471

社区成员

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

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