看了这篇文章中http://images.cnblogs.com/cnblogs_com/1-2-3/thread-synchronization/7.png
的情况 源码在这里class Program
{
static int n = 0;
static void foo1()
{
for (int i = 0; i < 1000000000; i++) // 10 亿
{ n = n + 1;
}
Console.WriteLine("foo1() complete n = {0}", n);
}
static void foo2()
{
for (int j = 0; j < 1000000000; j++) // 10 亿
{ n = n + 1;
}
Console.WriteLine("foo2() complete n = {0}", n);
}
static void Main(string[] args)
{
new Thread(foo1).Start();
new Thread(foo2).Start();
}
}
作者说 n在两个CPU的cache中都分别在加一,所以 进行了3个循环后 很可能 两边的cache里面 n都是3我自己加了代码,发现他说的情况是有的。但是按照intel的MESI缓存一致性协议的话 这种情况不应该发生啊:M: 被修改的。处于这一状态的数据只在本CPU中有缓存,且其数据已被修改,没有更新到内存中
E: 独占的。处于这一状态的数据只在本CPU中有缓存,且其数据没有被修改,与内存一致
S: 共享的。处于这一状态的数据在多个CPU中有缓存
I: 无效的。本CPU中的这份缓存已经无效了。 当CPU要读取数据时,只要缓存的状态不是I都可以从缓存中读,否则就要从主存中读。这一读操作可能会被某个处于M或E状态的CPU截获,该CPU将修改的数据写出到内存,并将自己设为S状态后这一读操作才继续进行。只有缓存状态是E或M时,CPU才可以修改其中的数据,修改后缓存即处于M状态。如果CPU要修改数据时发现其缓存不处于E或M状态,则需要发出特殊的RFO指令(Read For Ownership),将其它CPU的缓存设为I状态。
到底为什么这个缓存一致性协议 形同虚设呢?
的情况 源码在这里class Program
{
static int n = 0;
static void foo1()
{
for (int i = 0; i < 1000000000; i++) // 10 亿
{ n = n + 1;
}
Console.WriteLine("foo1() complete n = {0}", n);
}
static void foo2()
{
for (int j = 0; j < 1000000000; j++) // 10 亿
{ n = n + 1;
}
Console.WriteLine("foo2() complete n = {0}", n);
}
static void Main(string[] args)
{
new Thread(foo1).Start();
new Thread(foo2).Start();
}
}
作者说 n在两个CPU的cache中都分别在加一,所以 进行了3个循环后 很可能 两边的cache里面 n都是3我自己加了代码,发现他说的情况是有的。但是按照intel的MESI缓存一致性协议的话 这种情况不应该发生啊:M: 被修改的。处于这一状态的数据只在本CPU中有缓存,且其数据已被修改,没有更新到内存中
E: 独占的。处于这一状态的数据只在本CPU中有缓存,且其数据没有被修改,与内存一致
S: 共享的。处于这一状态的数据在多个CPU中有缓存
I: 无效的。本CPU中的这份缓存已经无效了。 当CPU要读取数据时,只要缓存的状态不是I都可以从缓存中读,否则就要从主存中读。这一读操作可能会被某个处于M或E状态的CPU截获,该CPU将修改的数据写出到内存,并将自己设为S状态后这一读操作才继续进行。只有缓存状态是E或M时,CPU才可以修改其中的数据,修改后缓存即处于M状态。如果CPU要修改数据时发现其缓存不处于E或M状态,则需要发出特殊的RFO指令(Read For Ownership),将其它CPU的缓存设为I状态。
到底为什么这个缓存一致性协议 形同虚设呢?
解决方案 »
- 求助,这句话怎么理解,写得让人更容易理解
- 【进者有分】C#winform怎么群发邮件,多个附件?
- 通过VPN连接的机子如何取得本机的IP、MAC、主机名等信息?
- 在c#中用g.Transform = new Matrix(1.0f,0.0f,0.0f, -1.0f,100.0f,800.0f)出现的问题
- c#---请教
- 请教,在《Programming C#》里,第一次介绍Dispose method时,示例代码里把它实现了两遍(也就是重载了它),我想问为什么要这样?
- csFile 的命名空间是什么?
- xml增加节点的问题
- WinForm,Chart中的水平滚动条如何始终居于最右边?
- 用SqlDataAdapter的Fill方法可否将视图绑定到DataSet上去。
- --new Thread 时候出错--
- 【数据读取提速】100分求socket一次发送多次接收数据的问题
add reg, 1
st reg, n由于这三条指令并没有被锁保护,所以他们的执行并不是原子的,而是可以interleave的。这才是造成问题的根本原因。
这本不错,现在可能不好买了。或者搜论文看,memory consistency有一篇综述。不过除非你需要设计一个线程模型,否则基本用不着。