2012-03-16 3 views
3

Как работает параллельная библиотека задач .NET с задачами блокировки? В библиотеке C++ Concrt у вас есть метод Context::Oversubscribe, но я не нашел такого в библиотеке .NET? Является ли опция LongRunningTask соответствующим способом обработки задач блокировки?Задача параллельной библиотеки - блокировка операций?

.i.e: в C++ вы могли бы сделать:

auto my_task_func = [] 
{ 
    //Do work... 
    Context::Oversubscribe(true); 
    // Short or long blocking op. 
    Context::Oversubscribe(false); 
    //Do more work. 

} 

ответ

3

TPL использует алгоритм пониженного, чтобы найти оптимальное количество потоков без сотрудничества со стороны самих задач. Он просто продолжает вводить потоки, пока скорость завершения задачи не улучшится.

+1

«ThreadPool» (который используется TPL за кулисами) также получает уведомления о том, что один из его потоков начал блокировать и использует эту информацию, чтобы решить, когда создавать новые потоки. – svick

+0

svick, хороший комментарий. Я также думаю, что это правда, хотя и не документировано. Кажется, я не могу найти ссылку на это прямо сейчас. – usr

+2

Я не знаю, является ли это на самом деле документом, но мой источник - это * CLR через C# *, 3-е издание, стр. 759: «Однако, если какой-либо из этих потоков добровольно блокирует [...], тогда Windows уведомляет пул потоков, что один из его потоки перестали работать. Теперь пул потоков [...] создает новый поток для замены заблокированного потока ». – svick

Смежные вопросы