2012-08-03 31 views
3

我想启动任意数量的线程,每个线程都执行相同的方法,但具有不同的参数。每个线程都需要在某个时间点阻塞,并等待所有线程到达同一个点。 (就像赛车手进入他们的出发区)如何将多个线程同步到一个公共点

我很难将所有线程信号传递给启动器,他们都准备好了。

+0

没有“任意数量的线程”WaitHandle可能是你的选择。但是对于真正的大数字,你应该使用信号量。 – Mithrandir 2012-08-03 13:54:01

+0

即使有众多已知线程,WaitHandle如何帮助启动器? – 2012-08-03 13:56:19

+0

初学者将不得不使用WaitAll,因此所有其他线程都可以指示达到某个点。 – Mithrandir 2012-08-03 13:59:06

回答

-1

我认为使用锁定可以同步线程的访问权限。

试试这个:

lock (lockThis) 
{ 
    // Access thread-sensitive resources. 
} 
+0

您如何知道所有线程都已完成? – 2012-08-03 15:04:17

-1

不久前,我还在多线程中苦苦挣扎。你所要达到的目标可以用你知道的很简单的方法完成。这里有一个想法:

class MyThread 
    { 
    private Thread thread; 
    private bool isWaitingAtPointA = false; 
    private bool continueWorking = false; 

    public MyThread() 
    { 
     thread = new Thread(DoMyStuff); 
    } 

    private void DoMyStuff() 
    { 
     //do stuff 

     //when at point A : 
     isWaitingAtPointA = true; 
     while (!continueWorking) 
     { 
      Thread.Sleep(10); 
     } 
     isWaitingAtPointA = false; 
     continueWorking = false; 

     //do more stuff 

    } 

    public bool isAtWaitingPointA() 
    { 
     return isWaitingAtPointA; 
    } 
} 

然后让MyThread的在你的主线程列表,将实例所有MyThread的对象,开始自己的线程,也从你的主线程continueWorking为true设置解锁。 显然你可以通过调用isAtWaitingPointA()来检查所有的线程是否在A点。我相信这种方法被称为“控制变量”(如果我错了,请有人纠正我),这里的控制变量是bools isWaitingAtPointA和continueWorking。 您希望它们全部使用的方法在这里由DoMyStuff()表示,它可以在其他地方定义以避免代码冗余。

我希望这能激发你=)

+0

这是如何详细说明x个线程是否仍在执行工作? – 2012-08-03 15:05:36

+0

@Peter Ritchie:当然,添加另一个控制变量非常困难......来吧!我们是这里的程序员还是所有的新手?此外,如果您计算等待的实例数量并进行简单的减法,那么您可以得到答案。这不是一个编程问题。你问的问题没有被问到。我认为障碍类对于这项任务过于复杂,或者这个问题被描述得太简单了。我为什么降级? – Lewis 2012-08-06 08:41:31

+0

我只会解决这个代码中的几个问题:1)它不能缩放。用你发布的代码,如果有更多的线程和CPU /内核,你会有一个巨大的“上下文切换”问题。当每个线程“旋转”等待标志改变时,这最终会给CPU带来巨大的负担。例如在进入任何“工作”(“do stuff here”注释)之前,CPU将是100%的负载。2)任何其他代码都无法更改。当然,你可以假设读者可以“找出那些东西”,但是你甚至没有试图发布可用的代码(忽略了设计问题)。 – 2012-08-06 14:49:19

相关问题