C# 如何将多个线程同步到一个公共点
我想启动任意数量的线程,每个线程执行相同的方法,但参数不同。每个线程都需要在某一点阻塞,并等待所有线程到达同一点。(就像赛车手进入起跑区一样)C# 如何将多个线程同步到一个公共点,c#,multithreading,.net-4.0,C#,Multithreading,.net 4.0,我想启动任意数量的线程,每个线程执行相同的方法,但参数不同。每个线程都需要在某一点阻塞,并等待所有线程到达同一点。(就像赛车手进入起跑区一样) 如何让所有线程都向初学者发出信号,表示它们都已准备就绪,这让我感到困惑。我认为使用锁定可以同步线程的访问 试试这个: lock (lockThis) { // Access thread-sensitive resources. } 解决办法是使用 不久前,我还在为多线程而挣扎。你想要达到的目标可以用你所知道的简单方法来实现。这里有一个想法:
如何让所有线程都向初学者发出信号,表示它们都已准备就绪,这让我感到困惑。我认为使用锁定可以同步线程的访问 试试这个:
lock (lockThis)
{
// Access thread-sensitive resources.
}
解决办法是使用 不久前,我还在为多线程而挣扎。你想要达到的目标可以用你所知道的简单方法来实现。这里有一个想法:
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正在等待积分并继续工作。
您希望所有人都使用的方法在这里由DoMyStuff()表示,可以在其他地方定义它以避免代码冗余
我希望这能启发你=)如果没有“任意数量的线程”,WaitHandle可能是你的一个选择。但是对于非常大的数字,你应该使用信号量。即使有已知数量的线程,WaitHandle如何帮助启动程序?启动程序必须使用WaitAll,以便所有其他线程都可以发出到达某一点的信号。这如何详细说明x个线程是否仍在执行工作?@Peter Ritchie:当然,添加另一个控制变量非常困难。。。来吧我们是程序员还是都是疯子?另外,如果你计算等待的实例数,然后做一个简单的减法,你就得到了答案。这不是一个编程问题。你问的问题没有被问到。我认为barrier类对于这个任务来说过于复杂,或者问题描述得太简单。为什么我会被降级?我只想用这段代码解决几个问题:1)它不能扩展。对于您发布的代码,如果有更多的线程和CPU/内核,您将有一个巨大的“上下文切换”问题。当每个线程“旋转”等待标志改变时,这将给CPU带来巨大的负载。e、 g.CPU在开始任何“工作”之前都是100%的负载(“在这里做东西”注释)2)任何其他代码都无法更改。当然,你可以假设读者可以“弄明白那些东西”,但你甚至没有尝试发布可用的代码(忽略设计问题)。@Peter Ritchie:谢谢你发布我等待的建设性评论。