Mono ThreadPool并发问题

sfi*_*man 8 c# mono threadpool

我写了一个使用ThreadPool进行多线程处理的软件.

ThreadPool.SetMinThreads(128, 128);
ThreadPool.SetMaxThreads(512, 512);

for (int i = 0; i < 40; i++)
{
    ThreadPool.QueueUserWorkItem(_ =>
    {
        Console.Write("!");
        Thread.Sleep(1000);
        Console.Write(".");
    }, null);
}
Run Code Online (Sandbox Code Playgroud)

在每个线程内部,我执行阻塞网络操作(使用http).围绕阻塞网络模型而设计的软件我无法转向非阻塞1线程I/O.

它在Windows平台上运行完美,每个核心可以使用128-512个线程,没有任何问题,所有工作都应该工作.但当我转向单声道时,我看到了一些非常奇怪的行为.我不能让每个CPU核心运行多个线程,我可以得到 - 每个核心1个线程,无论我在SetMinThreads/SetMaxThreads中指定的是什么.

在Linux下使用.NET 4/4.5,MONO版本3.2.1以及我之前系统上的一些旧版本.顺便说一句,普通线程代码运行良好,例如,这给出了所需的结果:

for (int i = 0; i < 20; i++)
{
   var t = new Thread(_ => {
      Console.Write("!");
      Thread.Sleep(1000);
      Console.Write(".");
   });
   t.Start();
}
Run Code Online (Sandbox Code Playgroud)

小智 7

我们还尝试了很多单声道,看起来有以下帮助:

  1. 将环境变量MONO_THREADS_PER_CPU设置为更高的值.例如,导出MONO_THREADS_PER_CPU = 300(linux).我不确定,但看起来你不能通过setmin/max线程调整线程池而不设置"每个cpu更多线程".
  2. 使用--server开关运行mono,但它从3.2.3开始工作.这里解释http://www.mono-project.com/Release_Notes_Mono_3.2 ,但可能是这个标志只有在没有足够的线程被触发时才有助于启动.

我们在linux上使用这两个选项和单声道表现得非常快(与windows上的.net相当)


Sey*_*ams -1

如果多线程不足以满足您的工作,为什么不使用这些东西的组合(例如:异步、多线程、并行)!?我认为这些可能对您有帮助: http://mono-for-android.1047100.n5.nabble.com/Task-Parallel-Framework-issues-td5711359.html stackoverflow.com/questions/5717059/implementation-of-任务在monodroid http://blog.errorok.com/2012/08/09/268/