分享

c#

 simplelam 2014-09-27

What is the difference between:

new Thread(new ThreadStart(SomeFunc))

and:

new Thread( delegate() { SomeFunc();} )

This code gives strange outputs on my computer:

public class A
{
    int Num;

    public A(int num)
    {
        Num = num;
    }

    public void DoObj(object obj)
    {
        Console.Write(Num);
    }

    public void Do()
    {
        Console.Write(Num);
    }
}

/////// in void main()

for (int i = 0; i < 10; i++)
{
    (new Thread(new ThreadStart((new A(i)).Do))).Start(); // Line 1
    (new Thread(new ThreadStart(delegate() { (new A(i)).Do(); }))).Start(); // Line 2
    (new Thread(delegate() { (new A(i)).Do(); })).Start(); // Line 3
}

If only Line 1 is executed the output is something like:

0 2 3 1 5 6 4 7 8 9

which is ok but if Line 2 or 3 is executed, output is:

3 3 3 5 5 7 7 9 9 10

There are some multiple numbers and a 10 which is quite strange that the loop is never run with the number 10. What is the trick behind these?

Thanks.

asked Nov 9 '10 at 13:38
ali_bahoo
2,66631846

1  
Read this section: /threading/#_Passing_Data_to_a_Thread , Read Lambda expressions and captured variables –  RobertPitt Nov 9 '10 at 14:45

2 Answers

up vote 12 down vote accepted

With the delegate, you are capturing i.

The difference is that with new ThreadStart((new A(i)).Do)), you are creating a new instance of A in the for loop with i as a parameter. That means that at that point, the value of i is taken and send to the constructor. The delegate you are sending is thus not of the creation of A, but you are actually sending the a delegate of the Do method of the instance of A to the constructor.

However, with delegate() { (new A(i)).Do(); }) (both of them), you are sending a reference of i to the thread.

The thread then takes some time to start and meanwhile, the for loop goes on. By the time i is used in the delegate (i.e. the thread has started), the for loop has moved on to 3 and that's what you see. The same goes for the second and third thread. The three threads are started but wait for the starting thread to complete some work. Then the created threads kick in (thread 1, 2 and 3) and they do their work. The Windows goes back to the thread with the for loop and goes on to start thread 4 and 5.

Some reading material:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多