ソケットを発見して以来、スレッド化についてわざわざ学びたくなかったので、ノンブロッキングバリアントを使用してきました。それ以来、私は糸脱毛についてより多くの経験を積み、自分自身に問いかけ始めています。なぜあなたはそれをソケットに使うのでしょうか?
スレッド化の大前提は、独自のデータセットで作業できるようになった場合にのみ意味があるようです。同じデータセットで2つのスレッドを処理すると、次のような状況になります。
if(!hashmap.hasKey("bar"))
{
dostuff // <-- meanwhile another thread inserts "bar" into hashmap
hashmap[bar] = "foo"; // <-- our premise that the key didn't exist
// (likely to avoid overwriting something) is now invalid
}
ここで、リモートIPをパスワードにマップするハッシュマップを想像してみてください。あなたは私がどこに行くのか見ることができます。確かに、そのようなスレッドの相互作用がうまくいかない可能性はかなり低いですが、それはまだ存在しており、プログラムを安全に保つために、すべての不測の事態を考慮する必要があります。これにより、単純なシングルスレッドのワークフローと比較して、設計にかかる労力が大幅に増加します。
個別のデータセットでの作業や、スレッドを使用するように明示的に最適化されたプログラムで、スレッドがどのように優れているかを完全に理解できます。しかし、プログラマーが機能する安全なプログラムの出荷のみに関心がある「一般的な」ケースでは、ポーリングよりもスレッドを使用する理由を見つけることができません。
しかし、「セパレートスレッド」アプローチは非常に普及しているため、何かを見落としているのかもしれません。私を啓発します!:)