多线程读写变量的问题

linsoo 2011-08-23 09:26:09
对于普通的变量integer类型和Cardinal这种,如果有两个线程,一个线程写,一个线程读,是否有可能造成异常? 是否需要互斥?

谢谢~
...全文
289 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
funxu 2011-08-24
  • 打赏
  • 举报
回复
InterlockedDecrement最快
临界区速度中
互斥最慢,因为它是跨进程的
haitao 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linsoo 的回复:]
引用 6 楼 sz_haitao 的回复:

32位整数的读写,已经相当原子

但是理论上还是不能保证完全没问题(A线程写了一半就被B线程读走)
只是发生的概率估计会很低

最好还是加互斥之类的包含一下


如果只是读取的数据错误的话,关系不大,只要别造成整个线程挂掉就行的...
[/Quote]

卡死、挂掉,一般是加锁后的死锁才导致的
linsoo 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sz_haitao 的回复:]

32位整数的读写,已经相当原子

但是理论上还是不能保证完全没问题(A线程写了一半就被B线程读走)
只是发生的概率估计会很低

最好还是加互斥之类的包含一下
[/Quote]

如果只是读取的数据错误的话,关系不大,只要别造成整个线程挂掉就行的...
浩南_哥 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 linsoo 的回复:]

我想知道的其实是,是否会造成这两个线程卡死或别的什么错误。
[/Quote]
是不是卡死,主要还是看你的这个变量的用途。一般就是读线程可能会读到脏数据。
haitao 2011-08-24
  • 打赏
  • 举报
回复
32位整数的读写,已经相当原子

但是理论上还是不能保证完全没问题(A线程写了一半就被B线程读走)
只是发生的概率估计会很低

最好还是加互斥之类的包含一下
linsoo 2011-08-24
  • 打赏
  • 举报
回复
我想知道的其实是,是否会造成这两个线程卡死或别的什么错误。
linsoo 2011-08-24
  • 打赏
  • 举报
回复
嗯,我这里是不需要关心读取的数据是否脏读,只要写进去的是1,2,3,别读出来是-1,-2,-3就可以...

这样也需要互斥吗?
rainychan2009 2011-08-23
  • 打赏
  • 举报
回复
请LZ参考 Delphi5开发人员指南 第13章关于多线程的。这一章全面介绍了线程、线程同步,另外有小例子,相信LZ在看书的过程中就能解决问题
bdmh 2011-08-23
  • 打赏
  • 举报
回复
会,或者用临界,或者用InterlockedDecrement系列函数,做原子方式的增加减少
浩南_哥 2011-08-23
  • 打赏
  • 举报
回复
添加临界区,如果不加限制肯定会造成读取的数据不争取。

16,746

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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