Mono ThreadPool并发问题

我写了一个使用ThreadPool进行multithreading处理的软件。

ThreadPool.SetMinThreads(128, 128); ThreadPool.SetMaxThreads(512, 512); for (int i = 0; i  { Console.Write("!"); Thread.Sleep(1000); Console.Write("."); }, null); } 

在每个线程内部,我执行阻塞网络操作(使用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  { Console.Write("!"); Thread.Sleep(1000); Console.Write("."); }); t.Start(); } 

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

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

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

如果multithreading对你的工作不够,你为什么不使用这些东西的组合(如:Asyn,MultiThreading,Parallel)! 我认为这些对您有所帮助: 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/