linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
来源:互联网 发布:淘宝上怎么样开店 编辑:程序博客网 时间:2024/04/29 18:37
网友回复关于size_t u=g_uCount这个必须是原子操作才可以保证正确性,这里做一个答复。
首先注意我对g_uCount的变量定义加了volatile,告诉编译器不要将这个变量优化进寄存器,也就是在多核情况下,每个核上的线程在从g_uCount取值时都是从内存中取的,也就是会锁总线,这显然是一个原子操作。在扯远一点从内存地址取值怎么就相当于锁总线呢?因为我们目前都是SMP架构,多个核共享一个内存,对称多处理的架构,核多个,L1Cache多个,但内存是一个,在同一时刻只有一个核可以从内存中取出来数据。
如果大家觉得不是原子操作,经不起推敲,可以举个例子来说服我,只一句经不起推敲是否不太妥当?
其次,即便把volatile修饰去掉,结果也是正确的,这个确实很难解释,我目前的水平还达不到完全解释的能力,有兴趣的读者可以参见:http://www.newsmth.net/bbstcon.php?board=CSArch&gid=34641。我想做芯片或者做编译器的同学应该能知道原因。
最后,这里举得例子都是很简单的,比如我的试验机只有4个核,在这个例子中,4个线程是最好的,多了反而无益,但实践中,是很难避免有慢速的设备和慢速的操作,超过4个线程通常都是有益的,可以在分时操作系统时间片的作用下,获得更好的吞吐率。
我们可以举个例子,比如银行有4个服务员(看成4core Cpu),有一票人(看做多个线程)在请求服务,现在的策略是分时服务,在某个老人(看做是一个线程)在窗口办一张银行卡,需要填表,该服务员每一个周期回头来检查一下老人是否填好了,没填好就处理别人的请求。这样总的吞吐率比服务员死等老人填完表要好得多。
最后我还是特别期待看到在g_uCount被修饰为volatile,且size_t u=g_uCount 不是原子操作的可运行的程序来证明,期待这两位网友和其他能作出这个实验的朋友们发给我,我贴出来,让大家一起学习一下,共同把这个问题深入搞清楚,如果不是常见的计算机或者操作系统也没关系,至少大家多长个见识
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pennyliang/archive/2010/11/10/5999933.aspx
- linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
- linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
- linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
- linux编程的108种奇淫巧计-7(Lock-free实验)
- linux编程的108种奇淫巧计-7(Lock-free实验)
- linux编程的108种奇淫巧计-9(Lock-free之二)
- linux编程的108种奇淫巧计-2(RDTSC)
- linux编程的108种奇淫巧计-2(RDTSC)
- linux编程的108种奇淫巧计-7(再答gangban_lau)
- *nux编程的108种奇淫巧计-6(shellcode)
- linux编程的108种奇淫巧计-8(嵌入汇编的另一种写法)
- linux编程的108种奇淫巧计-1(FALSE SHARING)
- linux编程的108种奇淫巧计-3(magic 2)
- linux编程的108种奇淫巧计-1(FALSE SHARING)【续】
- linux编程的108种奇淫巧计-4(编译展开)
- linux编程的108种奇淫巧计-4(编译展开)(续)
- linux编程的108种奇淫巧计-1(FALSE SHARING)
- linux编程的108种奇淫巧计-1(FALSE SHARING)【续】
- TCP连接的状态转换图深度剖析[转]
- Java 中 Vector、ArrayList、List 使用深入剖析
- GIS语义数据模型
- 我们选择学Java以后的路该怎样走?
- Java类加载器初探
- linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
- struts tech
- css入门
- 详解Java解析XML的四种方法
- 魔兽世界编程宝典(6)
- 冷眼看《娘妻》的热映
- POP3协议命令原始码及工作原理
- Debian squeeze 美化字体
- ASP.NET中的Theme功能