2012-03-16 12 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によって使用される)は、そのスレッドの1つがブロックを開始したという通知を受け取り、この情報を使って新しいスレッドをいつ作成するかを決定します。 – svick

+0

svick、良いコメント。私はまたこれが真実だとは考えていますが、これは文書化されていません私は今、その参照を見つけることができないようです。 – usr

+2

実際にドキュメントであるかどうかはわかりませんが、C#*、第3版、759ページを参照してください。*これらのスレッドのいずれかが自発的にブロックすると、Windowsはスレッドプールにスレッドの実行が停止しました。スレッドプールは[...]ブロックされたスレッドを置き換える新しいスレッドを作成します。 – svick

関連する問題