两个线程同时读写一个变量需不需要互斥?

ilovett 2004-12-15 01:52:05
两个线程同时读写一个变量需不需要互斥?
比如读写一个struct?double?int?char?
哪些情况下需要互斥?

比如读写一个char,如果能在同一个CPU时钟周期内完成,那么是否就无需互斥?
如果读写一个struct,如果无法在同一个CPU时钟周期内完成,那么是否就必须互斥?

哪位朋友可以解释一下?
...全文
1905 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2004-12-16
  • 打赏
  • 举报
回复
读,可以共享的读
写需要注意
lu1172101275 2004-12-16
  • 打赏
  • 举报
回复
按理来说,我们要得到最新的变量信息,那一般“先写后读”吧。可是,谁知道读线程,写线程他们什么时候执行啊 ,最好加互斥锁,保证你写没放开变量的时候,读线程不会一腿
插进来先读了,这样会产生“先读后写”,显然得到的是旧信息
gloomyfish 2004-12-16
  • 打赏
  • 举报
回复
要分情况的~~~~~
有时候临界资源就可以了
zdleek 2004-12-16
  • 打赏
  • 举报
回复
最好是要互斥 以数据结构为例
如果写到一半的时候数据结构被读取
那么读到的值有的是新的 有的是原来的 这个就会发生数据错误
gzlucky 2004-12-15
  • 打赏
  • 举报
回复
"char也未必可以在同一个CPU时钟周期内完成。你编译成汇编就知道了。"
为什么?

除非你的char变量是一个寄存器变量,否则你的赋值语句可能存在寻址,这样就不一定在同一个CPU时钟周期内完成了。如果是两个地址间的赋值(通常程序中定义的变量都是存放在内存的某个地址中),就可能是两条汇编甚至更多的语句来完成。
tabris17 2004-12-15
  • 打赏
  • 举报
回复
用InterlockedExchangeAdd,InterlockedExchangePointer来写变量就可以


不用互撤和临界区那么麻烦
ilovett 2004-12-15
  • 打赏
  • 举报
回复
"char也未必可以在同一个CPU时钟周期内完成。你编译成汇编就知道了。"
为什么?
broown 2004-12-15
  • 打赏
  • 举报
回复
读不用,写就必须。
简单的你可以用临界区类CCriticalSection类对资源进行同步保护
kugou123 2004-12-15
  • 打赏
  • 举报
回复
如果两个线程只读,就不需要,如果要写,就必须互斥,不然的化,会造成混乱。
HunterForPig 2004-12-15
  • 打赏
  • 举报
回复
纯粹只是读操作,无需互斥,因为变量值不会改变
写就需要,要不很容易出现脏数据,或异常
danyueer 2004-12-15
  • 打赏
  • 举报
回复
如果不是两个线程都写,就不需要互斥。否则,需要用关键段,对读写变量的过程进行同步处理。
cryptonym 2004-12-15
  • 打赏
  • 举报
回复
都读就不要。有读有写就要。
MZP 2004-12-15
  • 打赏
  • 举报
回复
只要是全局变量的访问,就要互斥!
如果变量正被一线程修改,而另一线程在读取,读取线程不加互斥一样会出错。
DentistryDoctor 2004-12-15
  • 打赏
  • 举报
回复
读不用,写就必须。

比如读写一个char,如果能在同一个CPU时钟周期内完成,那么是否就无需互斥?
谁保证?
如果读写一个struct,如果无法在同一个CPU时钟周期内完成,那么是否就必须互斥?
谁保证?
gzlucky 2004-12-15
  • 打赏
  • 举报
回复
读无所谓。

就怕有的在读,有的在写,或者是同时要写。

char也未必可以在同一个CPU时钟周期内完成。你编译成汇编就知道了。

15,471

社区成员

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

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