English 中文(简体)
C#中的多读
原标题:Multithreading in C#
  • 时间:2010-11-04 03:26:37
  •  标签:
  • c#

我试图从这本书中操作以下方案。

The author claims that the resultant output " should be "

页: 1

2000年

............

页: 10

如果管理正常处理器方案,但使用多处理器计算机,可以操作。

999

1998年

......

9998

采用正常的加固方法(编号+=1)但采用方案所示的内锁加法解决了这一问题(即,你先获得产出)。

Now I have got 3 questions. First why cant i use normal increment in the inner loop [i++ instead of Interlocked.Increment(ref i)]. Why has author choosed the other method?

Secondly what purpose does Thread.Sleep(页: 1) has in the context. When I comment out this line, I get second output even if I am using Interlocked method to increment number.

Thirdly I get correct output even by using normal increment method [number += 1] if I dont comment the Thread.Sleep(页: 1) line and second output if I do so.

现在,我正在执行英特尔(R)核心方案,如果该方案有任何改变的话,即7 Q820 cpu。

static void Main(string[] args)
{
    MyNum n = new MyNum();

    for (int a = 0; a < 10; a++)
    {
        for (int i = 1; i <= 页: 1; Interlocked.Increment(ref i))
        {
            Thread t = new Thread(new ThreadStart(n.AddOne));
            t.Start();
         }            
        Thread.Sleep(页: 1);
        Console.WriteLine(n.number);
    }
}

class MyNum
{
    public int number = 0;
    public void AddOne() 
    {
        Interlocked.Increment(ref number);
    }
}
问题回答

睡觉是看病结果之前的read。 这不是一个真正的答案,尽管他们应该在第二个阶段完成,但实际上并没有保证他们这样做。

在MyNum 班级中,有1 000英亩的间歇,没有保护,就很难读到数字,然后读出第二版,然后是头版,然后是第二版,而后倒是第二版。 请注意,如果存在多个核心,这种错误就更有可能发生,否则,只有在错误时间发生read转接时才会发生。

不过,我可以理解为什么需要保护。

Edit:由于该守则的实施速度太快,你正在取得同样的结果。 胎面的穿透速度快于它所创造的速度,因此, are头一遍。

Try:

public void AddOne()
{
int x = number + fibnocci(20) + 1 - fibnocci(20);
}

private int fibnocci(int n)
{
if (n < 3) return 1 else return fibnocci(n - 1) + fibnocci(n - 2);
}

(我希望最优化的草原足以杀死这一额外法典)

该法典实际上很奇怪。 由于<代码>Thread t在每一条路程上都在当地申报,因此可能由......收集垃圾。 NET因为没有提及胎面。 任何方面......

为了回答第一个问题,我看不到需要<代码>。 出现(f i)。 主线是连接<条码>i<>。 此处使用<代码>i++/code>不是问题。

关于第二个问题,<代码>Thread.Sleep(1000)已经到位,使该方案有足够的时间完成所有校对。 您的i7(高读率的基数)可能很快完成每个项目。

就第三个问题而言,取得相同结果实际上并不是有<代码>+= 1的保证。 两个核心可能读出相同的数字,并将数字加在一起(即1001 1001)。

最后,我不肯定你是否以欺骗方式管理该方案。 以释放方式建设方案,可能会给你带来不同的行为和副作用,而多面方案应当这样做。

如果你说得.的话。 睡觉线有很好的机会,即read线不会在印刷线之前完成......在这种情况下,你会看到数量少于“校正”产出,而不会因为cr子是原子。

在一个真正的多核心体系中,可以采取非组别的行动来核对。 也许,你为看到这种碰撞而做的是太少。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签