不要通过共享内存来通信,而应该通过通信来共享内存
这是一句风靡golang社区的经典语,对于刚接触并发编程的人,该如何理解这句话?
PHP中文网2017-04-18 10:55:51
https://blog.golang.org/share...
この記事では、共有メモリを使用する場合、マルチスレッド シナリオで競合状態を処理するために、共有メモリをロックする必要があることを明確に説明していますが、これは使用するのがより面倒です。さらに、ロックの使用が多すぎると、プログラムのコード ロジックが理解しにくくなり、デッドロックが発生した後、特にロックが多数存在する場合、問題のトラブルシューティングが非常に困難になります。同じ時間です。
go 言語のチャネルは、同時に 1 つの goroutine だけが内部のデータにアクセスできるようにし、開発者に洗練されたシンプルなツールを提供します。そのため、go のネイティブな方法は、共有メモリを使用する代わりにチャネルを使用して通信することです。通信する。
PHP中文网2017-04-18 10:55:51
共有メモリでは、複数のスレッドが同時にデータにアクセスして変更する必要があり、データのセキュリティと可視性を確保するために、ロックが実行され、並列処理がシリアル化され、CPU もスレッドのロック取得でビジー状態になります。方法を変更して、各スレッドが独自にデータをコピーする方が、1 つのスレッドが 1 つの処理を完了する限り、他のスレッドがロックを取得する必要がなくなります。同時実行性を達成するためにスレッドを通知の形式で引き渡します。
伊谢尔伦2017-04-18 10:55:51
実際、分散の観点から理解すると、より明確になります。
たとえば、2 つのプロセス ab が同じメッセージ キューを一緒に操作する場合、共有メモリが使用される場合、2 つのプロセスは同じ物理マシンに限定される必要があり、通信の意味は大幅に減少します。
設計時にメッセージ キューに読み取りと書き込みのインターフェイスのみが提供され、内部実装についてまったく心配する必要がない場合、メッセージ キューは共有メモリのように見えるでしょう。ただし、メッセージ キューはソケットを使用して通信できます。
つまり、上記の文、通信の実装に共有メモリを使用しないということは、最初からプログラムを単一のマシンに限定するのではなく、通信を使用する、つまり内部実装をカプセル化し、対応する処理を実行するためのインターフェイスを提供することを意味します。運営