日期:2014-05-17  浏览次数:21003 次

多线程,这个变量貌似是多余的哦?
//同步方式:
            ShareState state = new ShareState();    //用于同步(锁定)的对象.
            int numTask = 20;
            Task[] tasks = new Task[numTask];   //任务数组.
            for(int i = 0; i < tasks.Length; i++) {
                Demo d = new Demo(state);
                d = Demo.Synchronized(d);   //同步对象.
                tasks[i] = new Task(d.DoTheJob);
                tasks[i].Start();
            }
            for(int i = 0; i < tasks.Length; i++)
                tasks[i].Wait();
/*有个网友和我说:
for语句最好改为(因为Task的Start不一定马上启动,但是i此时已经++了,可能产生同步性问题)。

 for (int i = 0; i < tasks.Length; i++)
            {
                int j = i;
                Demo d = new Demo(state);
                d = Demo.Synchronized(d);   //同步对象.
                tasks[j] = new Task(d.DoTheJob);
                tasks[j].Start();
            }
我觉得这个是多余的,就算是延迟..但是它的值还是不变的,不是么...比如,这里赋值为 tasks[1].Start();(这个延迟,还没有启动).然后下一个 tasks[2].Start()开始启动...但是他们的赋值...不会影响到对方的,在内存中只是等待状态而已...对吧...
*/

------解决方案--------------------
没必要按你网友说的那样写
那样写有什么用呢?
for里面那段都是顺序执行的,搞一个变量又赋一次值干嘛呢,多此一举
Task包含的那个函数才是异步执行罢了
------解决方案--------------------
你用Task.Wait方法就可以实现线程同步的机制的了,其实那个方法内部就会帮我们实现一个同步锁的,所以你用Task.Wait方法就已经解决了同步的问题,只有等任务完成之后才会完成另一个任务的
------解决方案--------------------
引用:
/*有个网友和我说:
for语句最好改为(因为Task的Start不一定马上启动,但是i此时已经++了,可能产生同步性问题)。

这是典型的“死扣字眼,而不理解”的结果。

你的各个线程执行的方法中没有共享利用i变量(或者是i变量所引用的对象),哪来的什么“同步性问题”?