首先Thread.VolatileWrite和Thread.VolatileRead是基于原子操作的,直接上一例子吧,看我理解的对不对现在有一个公共资源Int64 n;CPU是32位的
假如把一个VolatileWrite这个操作放慢速度,执行这个方法是需要10s问题1:
线程1正在执行VolatileWrite(ref n,0x0123456789abcdef)
线程2在线程1正执行VolatileWrite的时候,要执行VolatileRead(ref n),假如线程1中的VolatileWrite执行了一半,即过了5秒,那么线程2中的VolatileRead是不是要等5秒后VolatileWrite执行完后才能执行?
反过来,线程1正在VolatileRead的时候,线程2中的VolatileWrite是不是也要待VolationRead后才能执行,否则VolatileWrite则处于阻塞状态,尽管阻塞很短很短的时间问题2:
如果两个线程都同时,注意是同时执行VolatileRead(ref n),对于两个线程来讲,在这时是不是不存在阻塞,类似于ReaderWriterLock中的读锁
线程Volatile原子操作
假如把一个VolatileWrite这个操作放慢速度,执行这个方法是需要10s问题1:
线程1正在执行VolatileWrite(ref n,0x0123456789abcdef)
线程2在线程1正执行VolatileWrite的时候,要执行VolatileRead(ref n),假如线程1中的VolatileWrite执行了一半,即过了5秒,那么线程2中的VolatileRead是不是要等5秒后VolatileWrite执行完后才能执行?
反过来,线程1正在VolatileRead的时候,线程2中的VolatileWrite是不是也要待VolationRead后才能执行,否则VolatileWrite则处于阻塞状态,尽管阻塞很短很短的时间问题2:
如果两个线程都同时,注意是同时执行VolatileRead(ref n),对于两个线程来讲,在这时是不是不存在阻塞,类似于ReaderWriterLock中的读锁
线程Volatile原子操作
解决方案 »
- [Help]如何实现让程序来修改MSN和QQ的状态?
- 如何在C#中实现Windows的资源管理器,并且可以反馈修改信息
- 求1到100的素数(50分)
- 请问一下这句话怎么理解? -- "类继承是在编译时刻静态定义的"
- 我做了C#的一个服务器,可对方发过来的INT型是网络字节。在C#中有没有把网络字节的函数啊?帮个忙,在线等。急啊。。
- 新人请教一个DataSet问题
- 再问一个ActiveReport.Net的问题
- WINFORM 想实现个可伸缩的这样一个PANEL
- 请问:在C#中,如何将数学表达式的字符串进行数学运算,例如:
- c# 截取图片的一部分并保存
- 请教一个关于生命周期的问题.
- 求助 谁用过 Aspose.Cells,好像XP上不可以用。
问题1:是要“阻塞”(其实是空转,并没有真正阻塞,因为是用户模式构造),这个线程协调是通过cpu指令来的,在硬件中发生,所以非常快。又读写速度非常快,几乎可以忽略空转时间。问题2:如上面提到的,线程的协调是通过cpu指令来的,但具体怎么做,我不清楚。但既然是只读的操作,我认为这里不会存在冲突,所以不会“阻塞”。
这里的“这个线程协调是通过cpu指令来协调的” 是不是这样理解的,比如多CPU中,一个CPU对一个变量进行写操作,另一个CPU对一个变量进行读操作时,发现这个变量正在写入,所以调用了一些特殊的CPU,对其中一个指令进行类似“自旋”的操作,或者类型一个什么都不做的指令?
那如果在单CPU时,涉及到两个线程的时间片的切换,例如一个线程正在写入,由于CPU是32位,变量是64位,当这个线程写了一半,这时写的线程时间片到了,要切换到Read线程时,这时CPU是怎么协调的呢?
这里的“这个线程协调是通过cpu指令来协调的” 是不是这样理解的,比如多CPU中,一个CPU对一个变量进行写操作,另一个CPU对一个变量进行读操作时,发现这个变量正在写入,所以调用了一些特殊的CPU,对其中一个指令进行类似“自旋”的操作,或者类型一个什么都不做的指令?
那如果在单CPU时,涉及到两个线程的时间片的切换,例如一个线程正在写入,由于CPU是32位,变量是64位,当这个线程写了一半,这时写的线程时间片到了,要切换到Read线程时,这时CPU是怎么协调的呢?不同结构的CPU有不同的指令集,这些指令集就是一些数字符号,汇编语言的指令就对应CPU指令。
我觉得应该是在寄存器中设置标识来协调的,具体什么指令,如何协调我不清楚。“空转”是指线呢并不会真正的阻塞。而是仍会占用CPU资源。
而其他变量则会被优化成寄存器操作在C++中对于双检锁创建单例的bug,就常用MemoryBarrier来解决,包括.Net中封装的InterlockedExchange等也用到了所以是会阻塞的,一种内核级(汇编)的自旋锁
http://hi.baidu.com/crazii_chn/item/6440edd016888595270ae742