摘要: 惭愧的很,这个单词见过很多年,见人用过很多次,却不曾真正了解其本质作用。最近多线程工作多些,才开始重新注意这个关键词。默认情况下,内存在读写时会同时刷新至缓存、寄存器,那么下次再使用这个变量时,就会从缓存、寄存中读取,加快了速度。但是在多线程时,每个cpu的每个核心有自己的缓存,当改变内存值时,可能其他核心不知道这个改变,仍在使用自己的缓存值,就造成了错误。volatile标记这个内存不会被缓存,从而其他核心使用内存时总是从内存读取,只要内存值被改变,其他核心读取时就是最新值。好处是避免了使用错误值,坏处是降低了速度(但比使用锁快)。可以用来在类似isEnable之类的操作上使用,解决一些轻量 阅读全文
posted @ 2013-08-09 17:38 ^^! 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 1 依赖QCall.net3个Timer,form.timer会占用ui线程,更重要的是非winform程序你会去引用form吗,所以一般不用。threading中的timer提供的方法不好用,一般也不用,常用的是System.Timer.TimerSystem.Timer.Timer实现上是依赖threading中的timer,而threading的timer又依赖TimerQueueTimer,最终是Qcall中的方法。再也反编译不到代码了,看不到具体如何实现的。Timer是很常用功能,往往这种常用的其实很难实现,即使实现了还可能一堆缺点。这种不知根知底的东西还是尽量少用吧。http:// 阅读全文
posted @ 2013-08-09 16:17 ^^! 阅读(709) 评论(0) 推荐(0) 编辑
摘要: 当需要对磁盘做长时间高速IO时,为了避免IO争用造成大量时间用于寻道而导致吞吐量降低,以及长时间IO造成错误数超限导致磁盘进入降速模式。在这种极限耗尽磁盘性能的情况下,应当把磁盘当做只能做单个任务的串行设备来用,对所有IO自行控制,排队依次执行,不能过分相信操作系统能把该问题解决好。 1 using System; 2 using System.Collections.Concurrent; 3 using System.Collections.Generic; 4 using System.Diagnostics; 5 using System.IO; 6 using Syste... 阅读全文
posted @ 2013-08-09 11:01 ^^! 阅读(663) 评论(1) 推荐(0) 编辑