FP支持者は、パラダイムが可変状態を回避するため、並行性は簡単であると主張しています。わかりません。
私はこの一般的な質問について、機能的な初心者であるが、長年にわたって副作用が眼球にかかっていて、より簡単な(または特に「安全な」、エラーが発生しにくい」同時性。私は機能的な仲間と彼らが何をしているのかを見ると、少なくともこの点で草は少し緑がかったようで、より良い香りがします。
シリアルアルゴリズム
つまり、あなたの特定の例について、あなたの問題が本質的にシリアルであり、Aが完了するまでBを実行できない場合、概念的には、AとBを何としても並行して実行することはできません 古いゲームの状態を使用して並行移動することに基づいて回答のように順序依存性を解消する方法を見つけるか、その一部を独立して変更できるデータ構造を使用して、他の回答で提案されている順序依存性を排除する必要があります、またはこの種のもの。ただし、このような概念設計上の問題は間違いなくあり、不変であるためすべてを簡単にマルチスレッド化できるとは限りません。可能であれば、順序の依存関係を解消するスマートな方法を見つけるまで、本質的にシリアルなものがいくつかあります。
より簡単な同時実行
ただし、スレッドセーフではない可能性があるために、パフォーマンスを大幅に向上させる可能性のある場所で副作用を伴うプログラムを並列化できない場合が多くあります。可変状態(または、より具体的には外部副作用)を排除することは、私が見ているように、「スレッドセーフであるかどうか」を「確実にスレッドセーフ」に変えることで大いに役立ちます。
このステートメントをもう少し具体的にするために、コンパレーターを受け入れ、それを使用してエレメントの配列をソートするソート関数をCで実装するタスクを与えると考えてください。これは非常に一般化することを意図していますが、このようなスケール(数百万以上の要素)の入力に対して使用され、常にマルチスレッド実装を使用することは間違いなく有益であるという簡単な仮定を与えます。ソート機能をマルチスレッドできますか?
問題は、ソート関数が呼び出すコンパレーターが可能性のあるすべてのケースについて、それらがどのように実装されているか(少なくとも文書化されているか)がわからない限り、副作用を引き起こします。コンパレータは、内部でグローバル変数を非アトミックな方法で変更するようなうんざりすることができます。コンパレータの99.9999%はこれを行えないかもしれませんが、副作用を引き起こすかもしれないケースの0.00001%のために、この汎用関数をマルチスレッド化することはできません。その結果、シングルスレッドとマルチスレッドの両方のソート機能を提供し、それを使用するプログラマーに責任を渡して、スレッドの安全性に基づいてどちらを使用するかを決定する必要があります。また、コンパレータがスレッドセーフかどうかわからない場合があるため、人々はまだシングルスレッドバージョンを使用し、マルチスレッドの機会を逃す可能性があります。
あらゆる場所にロックを投げることなく、物のスレッドの安全性を合理化することに関与することができる脳力がたくさんあります。機能が現在および将来にわたって副作用を引き起こさないという厳しい保証があれば、それは消え去ります。そして、恐怖があります:実際の恐怖。競合状態を何度もデバッグしなければならなかった人は、110%確信できないものをマルチスレッド化することにsuchするでしょう。最も妄想的な(少なくとも私はおそらく境界線である)場合でも、純粋な関数は、安心して並行して呼び出すことができるという安心感と自信を提供します。
そして、そのような関数が純粋な関数型言語で得られるスレッドセーフであることを強く保証できるなら、それはとても有益だと思う主なケースの1つです。もう1つは、関数型言語は最初の段階で副作用のない関数の作成を促進することが多いということです。たとえば、大規模なデータ構造を入力し、元のデータ構造に触れずに元のデータ構造のごく一部を変更しただけの新しいデータ構造を出力することが合理的に非常に効率的な永続的なデータ構造を提供します。そのようなデータ構造なしで作業している人は、それらを直接変更し、途中でいくつかのスレッドの安全性を失いたいかもしれません。
副作用
そうは言っても、私は機能的な友人(私は非常にクールだと思う)に敬意を払って1つの部分に同意しません。
[...]パラダイムが可変状態を回避するため。
同時実行性を私が見るほど実用的にするのは、必ずしも不変性ではありません。副作用の発生を回避する機能です。関数が配列を入力して並べ替え、コピーし、コピーを変更してその内容を並べ替えて出力する場合、同じ入力を渡しても、不変の配列型を操作するものと同じようにスレッドセーフです複数のスレッドからそれに配列します。だから、いわば、非常に並行性にやさしいコードを作成する可変型の場所があると思いますが、不変型には多くの追加の利点があります。副作用のない関数を作成するためにすべてを深くコピーする費用を排除します。
そして、追加のデータをシャッフルしてコピーするという形で、副作用のない関数を作成することでオーバーヘッドが発生することがあります。場合によっては、間接的なレベルを追加し、永続的なデータ構造の一部にGCを追加しますが、 32コアのマシンであり、より多くのことをより自信を持って並行して行うことができれば、交換はおそらく価値があると思います。