【发布时间】:2014-10-31 07:52:34
【问题描述】:
以下代码 5 个具有不同优先级的线程正在竞争访问具有 8 个内核的 CPU(Mac OS X 10.8.5,Mono)。每个线程都会增加它的计数器。
using System;
using System.Threading;
class PriorityTesting
{
static long[] counts;
static bool finish;
static void ThreadFunc(object iThread)
{
while(true)
{
if(finish)
break;
counts[(int)iThread]++;
}
}
static void Main()
{
counts = new long[5];
Thread[] t = new Thread[5];
for(int i=0; i<t.Length; i++)
{
t[i] = new Thread(ThreadFunc);
t[i].Priority = (ThreadPriority)i;
}
// Запускаем потоки
for(int i=0; i<t.Length; i++)
t[i].Start(i);
// Даём потокам возможность поработать 10 c
Thread.Sleep(10000);
// Сигнал о завершении
finish = true;
// Ожидаем завершения всех потоков
for(int i=0; i<t.Length; i++)
t[i].Join();
// Вывод результатов
for(int i=0; i<t.Length; i++)
Console.WriteLine("Thread with priority {0, 15}, Counts: {1}", (ThreadPriority)i, counts[i]);
}
}
编译:
$ mcs PriorityTesting.cs
$ mono PriorityTesting.exe
输出:
Thread with priority Lowest, Counts: 178544880
Thread with priority BelowNormal, Counts: 167783608
Thread with priority Normal, Counts: 160593225
Thread with priority AboveNormal, Counts: 79123315
Thread with priority Highest, Counts: 81623159
为什么优先级最低的线程比优先级最高的线程调用次数多?
UPD:
2 核 CPU 上的相同代码给出(Windows、.NET):
Thread with priority Lowest, Counts: 7608195
Thread with priority BelowNormal, Counts: 10457706
Thread with priority Normal, Counts: 17852629
Thread with priority AboveNormal, Counts: 297729812
Thread with priority Highest, Counts: 302506232
为什么不一样?
【问题讨论】:
-
如果您修复代码以便将
finish变量标记为volatile(应该如此),您是否注意到不同的行为?当然,我正在抓紧救命稻草,但它可能会有所不同,具体取决于您在什么硬件上运行它。 -
我会以某种方式更改
ThreadFunc,以便更好地切换线程,如 Thread.Yield 或 Console.WriteLine... 也许是因为循环太快,结果会失真。 -
你测试过哪个操作系统?
-
在以不同方式运行 Win7x64-I7-950 (debug/release/cmd-line/msvsdev) 后,结果如下;此代码也可能在 MS .Net 运行时产生意外结果(请参阅下面的答案以了解可能的原因)。
标签: c# multithreading mono task-parallel-library thread-priority