Tôi có một chương trình con xử lý các khối thông tin lớn. Để tận dụng toàn bộ CPU, nó chia công việc thành các luồng riêng biệt. Sau khi tất cả các chủ đề đã hoàn thành, nó kết thúc. Tôi đọc rằng việc tạo và hủy các chủ đề sử dụng rất nhiều chi phí, vì vậy tôi đã thử sử dụng threadpool, nhưng điều đó thực sự chạy chậm hơn so với việc tạo chủ đề của riêng tôi. Làm thế nào tôi có thể tạo chủ đề của riêng mình khi chương trình chạy và sau đó tiếp tục sử dụng lại chúng? Tôi đã thấy một số người nói rằng nó không thể được thực hiện, nhưng threadpool hiện nó vì vậy nó phải có thể, phải không?Cách sử dụng lại các chủ đề trong .NET 3.5
Đây là một phần của mã mà ra mắt chủ đề mới/sử dụng threadpool:
//initialization for threads
Thread[] AltThread = null;
if (NumThreads > 1)
AltThread = new Thread[pub.NumThreads - 1];
do
{
if (NumThreads > 1)
{ //split the matrix up into NumThreads number of even-sized blocks and execute on separate threads
int ThreadWidth = DataWidth/NumThreads;
if (UseThreadPool) //use threadpool threads
{
for (int i = 0; i < NumThreads - 1; i++)
{
ThreadPool.QueueUserWorkItem(ComputePartialDataOnThread,
new object[] { AltEngine[i], ThreadWidth * (i + 1), ThreadWidth * (i + 2) });
}
//get number of threads available after queue
System.Threading.Thread.Sleep(0);
int StartThreads, empty, EndThreads;
ThreadPool.GetAvailableThreads(out StartThreads, out empty);
ComputePartialData(ThisEngine, 0, ThreadWidth);
//wait for all threads to finish
do
{
ThreadPool.GetAvailableThreads(out EndThreads, out empty);
System.Threading.Thread.Sleep(1);
} while (StartThreads - EndThreads > 0);
}
else //create new threads each time (can we reuse these?)
{
for (int i = 0; i < NumThreads - 1; i++)
{
AltThread[i] = new Thread(ComputePartialDataOnThread);
AltThread[i].Start(new object[] { AltEngine[i], ThreadWidth * (i + 1), ThreadWidth * (i + 2) });
}
ComputePartialData(ThisEngine, 0, ThreadWidth);
//wait for all threads to finish
foreach (Thread t in AltThread)
t.Join(1000);
foreach (Thread t in AltThread)
if (t.IsAlive) t.Abort();
}
}
}
ComputePartialDataOnThread đơn giản unpackages thông tin và kêu gọi ComputePartialData. Dữ liệu sẽ được xử lý được chia sẻ giữa các luồng (chúng không cố gắng đọc/ghi cùng một vị trí). AltEngine [] là một công cụ tính toán riêng biệt cho mỗi luồng.
Thao tác này chạy khoảng 10-20% khi sử dụng dải chỉ.
Bạn có thể đăng mã của mình để chúng tôi có thể xem bạn đang làm gì không? Có thể bạn đang làm điều gì đó sai với hồ bơi chủ đề gây ra nó quá chậm. –
Có thể nó chỉ chạy chậm trong lần chạy thử nghiệm của bạn, tức là bạn nhấn số lượng chuỗi ban đầu, vì vậy nó phải tạo ra nhiều chuỗi hơn để đáp ứng nhu cầu của bạn. Hãy thử đặt thủ công số lượng chủ đề tối thiểu trong nhóm trước khi chạy bất kỳ thử nghiệm nào. –
Số lượng các chủ đề có nghĩa là để phù hợp với số lượng lõi xử lý. Trong trường hợp này, chỉ có 2. – HypnoToad