为什么多个线程不能同时访问一个全局变量?(100分)

  • 主题发起人 主题发起人 SYT
  • 开始时间 开始时间
S

SYT

Unregistered / Unconfirmed
GUEST, unregistred user!
定义了一个全局变量 i:Byte;
该变量可以由线程1访问,也可以由线程2访问,还可以由其它的事件程序(如BottonClick)
来访问,
如果该变量i不加任何保护,本人自己在想应该不会产生冲突,因为我们知道几个线程同时
执行这只是一种表面现象,实际上cpu同一时刻只能执行一条指令,因此当一个线程在读写变
量i时,另一个线程或其它进程肯定不会对变量i进行操作,因为cpu同一时刻只能执行一条
指令呀?
我不知道多个线程访问一个全局变量会产生冲突究竟是因为什么原因造成的,有哪位高手
能够帮我细心的讲解一下.
 
会造成数据不符,产生错误
 
实际上cpu同一时刻只能执行一条指令-------因为这个和多线程调用的先后不确定性,
造成结果的不确定性,如:
设i原值为1
线程1执行i++,而线程2读i,因是两个不同线程,在无同步措施或保护机制下,
当赋值操作在读操作之前的话,读出i=1,否则读出2,而为哪个是不确定的
 
如果是 32-bit 的数据问题其实不大。关键问题在于那些需要多条汇编语句进行操作
的数据。如果同时写入数据,不会产生你想象的“访问冲突”,但是很多情况下执行
的结果是不可预料的。
 
多线程必须考虑临界段、同步、互斥
 
TO Zyy04:
你的解释很细致,但是我还想知道的是:有时后i的值对于2个线程来说并不是很重要的,也就是
说,i无论为多少都没有关系(在我设计的程序中就有这种情况),在这种情况下i是否还需要保护.
 
当然不需要。不过这样你的程序又要i干什么?
 
因为如果变量val的值需要四个字节存储的话,一个线程a正在修改他的值,
而另一个线程b要读取他的值。如果读取的时候,线程a的20毫秒结束时val刚好
只有前两个字节发生了变化,那么接下来线程b的20毫秒所读取的值就有不确定性。
需要用同步来处理。
 
线程同步,互斥的问题。
 
To SYT:
那你的i还有意义么?
 
如果你的程序只有一个线程在写数据,而其他线程只是读取数据,特别是读取数据的线程对
数据的变化并不敏感的话,则加不加互斥对象我看也无所谓,我的线程应用和你的差不多。
 
这是标准的互斥访问问题,你这里的变量i属于临界资源,各进程必须互斥访问,否则程序
将失去再现性,这个问题应该用信号量来实现,最好看一看操作系统的读者写者问题,
讲得很清楚,各种版本肯定都有这个典型例子的。
 
TO SYT:
兄弟,我想你最好找本操作系统的书看看,最好是UNIX的
就算是很烂的书,对你这个问题的描述,我想对你也会有很大的帮助
这个问题已经研究了很久了啊
从单任务到多任务,从单CPU到多CPU,可谓是问题可大可小啊
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部