Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将多个线程同步到一个公共点_C#_Multithreading_.net 4.0 - Fatal编程技术网

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:谢谢你发布我等待的建设性评论。