Mat*_*ond 2 c# lambda multithreading thread-safety
更新的问题更通用:
我有以下代码.当您交换线程[i] .Join()的位置时,您会得到不同的输出.
static void ThreadedWorker(int startIndex, int endIndex)
{
Console.WriteLine("Working from results[ " + startIndex +"] to results["+endIndex+"]");
}
static void Main(string[] args)
{
int threadCount = System.Environment.ProcessorCount;
int calculationCount = 500; //the number of array elements we'd be iterating over if we were doing our work
int threadDataChunkSize = calculationCount / threadCount;
if (threadDataChunkSize < 1) threadDataChunkSize = 1; //just in case we have loads of threads
Thread[] threads = new Thread[threadCount];
for (int i = 0; i < threadCount; i++)
{
threads[i] = new Thread(() => ThreadedWorker(threadDataChunkSize * i, threadDataChunkSize*(i+1)));
threads[i].Start();
//threads[i].Join(); //****Uncomment for correct behaviour****
}
for (int i = 0; i < threadCount; i++)
{
//threads[i].Join(); //****Uncomment for incorrect behaviour****
}
Console.WriteLine("breakhere");
}
Run Code Online (Sandbox Code Playgroud)
当Join()在第一个循环中,创建顺序行为时,您将获得输出
Working from results[ 0] to results[125]
Working from results[ 125] to results[250]
Working from results[ 250] to results[375]
Working from results[ 375] to results[500]
Run Code Online (Sandbox Code Playgroud)
当Join()在第二个循环中,创建并行行为时,您将得到非确定性输出,如:
Working from results[ 375] to results[500]
Working from results[ 375] to results[500]
Working from results[ 500] to results[625]
Working from results[ 500] to results[625] (i is sometimes more than it should ever be!)
Run Code Online (Sandbox Code Playgroud)
我怀疑lambda表达式会以某种方式导致问题.希望这个改述也表明这不是一个错误的计算错误,或其他滥用我的阵列!
最初的问题不太通用,并使用startIndex和endIndex来迭代执行工作的字节数组.我将其描述ThreadedWorker为"不工作",因为它似乎有时更新结果数组,有时不会.它现在似乎被调用,但startindex和endindex被破坏了.
Join在启动它之前,在启动下一个线程之前,每个线程的第一个代码.
因此,所有线程按顺序运行.
第二个代码立即运行所有线程,然后立即运行所有线程Join.
因此,线程在完全相同的数据上并发运行.
第二个代码可能无法正常工作,因为您的代码或数据不是线程安全的.