Thực tế, .NET Framework và Windows quản lý các chủ đề khá tốt, phân phối đều trên mọi bộ xử lý. Tuy nhiên, việc phân phối các chủ đề có thể được thao tác thủ công bằng cách sử dụng Process
và ProcessThread
.
using System;
using System.Diagnostics;
using System.Threading;
namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
//Get the our application's process.
Process process = Process.GetCurrentProcess();
//Get the processor count of our machine.
int cpuCount = Environment.ProcessorCount;
Console.WriteLine("CPU Count : {0}", cpuCount);
//Since the application starts with a few threads, we have to
//record the offset.
int offset = process.Threads.Count;
Thread[] threads = new Thread[cpuCount];
Console.WriteLine(process.Threads.Count);
LogThreadIds(process);
//Create and start a number of threads that equals to
//our processor count.
for (int i = 0; i < cpuCount; ++i)
{
Thread t = new Thread(new ThreadStart(Calculation))
{ IsBackground = true };
t.Start();
}
//Refresh the process information in order to get the newest
//thread list.
process.Refresh();
Console.WriteLine(process.Threads.Count);
LogThreadIds(process);
//Set the affinity of newly created threads.
for (int i = 0; i < cpuCount; ++i)
{
//process.Threads[i + offset].ProcessorAffinity = (IntPtr)(1L << i);
//The code above distributes threads evenly on all processors.
//But now we are making a test, so let's bind all the threads to the
//second processor.
process.Threads[i + offset].ProcessorAffinity = (IntPtr)(1L << 1);
}
Console.ReadLine();
}
static void Calculation()
{
//some extreme loads.
while (true)
{
Random rand = new Random();
double a = rand.NextDouble();
a = Math.Sin(Math.Sin(a));
}
}
static void LogThreadIds(Process proc)
{
//This will log out all the thread id binded to the process.
//It is used to test whether newly added threads are the latest elements
//in the collection.
Console.WriteLine("===Thread Ids===");
for (int i = 0; i < proc.Threads.Count; ++i)
{
Console.WriteLine(proc.Threads[i].Id);
}
Console.WriteLine("===End of Thread Ids===");
}
}
}
Bây giờ hãy kiểm tra trình quản lý tác vụ, chúng ta có thể thấy rằng bộ xử lý thứ hai đang lấy tất cả tải công việc. The task manager window
Nguồn
2018-01-14 03:26:08
Hỏi: "Chúng tôi có thể đặt hai hoặc hai tác vụ thực thi với mối quan hệ bộ vi xử lý khác nhau trong C# Application?" Lưu ý rằng OP yêu cầu _threads_ khác nhau trong cùng một _process_. Vì vậy, câu hỏi không phải là về _process_, nhưng _thread_ affinity. –
Có 'Thread.SetProcessorAffinity()' nhưng nó chỉ áp dụng cho XNA cho Xbox 360. Không có giải pháp OOTB trong vani .NET, theo như tôi biết. –
@andras: Tốt, tôi đoán tôi đã bỏ lỡ một chút. Có một cách để làm điều này cho các chủ đề quá, và tôi chỉnh sửa ví dụ của tôi cho phù hợp. Cảm ơn! – Phillip