java - 如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?
大家讲道理
大家讲道理 2017-04-18 10:53:51
0
4
1785

不要通过共享内存来通信,而应该通过通信来共享内存

这是一句风靡golang社区的经典语,对于刚接触并发编程的人,该如何理解这句话?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(4)
Ty80

https://blog.golang.org/share...

이 기사에서는 공유 메모리를 사용하는 경우 멀티 스레드 시나리오에서 경쟁 조건을 처리하려면 잠금을 수행해야 하며 이는 사용하기 더 까다롭다는 점을 더 명확하게 설명합니다. 또한 너무 많은 잠금을 사용하면 프로그램의 코드 논리를 쉽게 이해하기 어렵게 만들고 프로그램이 쉽게 교착 상태에 빠지게 할 수 있으며, 특히 교착 상태가 발생한 후에는 문제를 해결하기가 매우 어렵습니다. 같은 시간.

Go 언어의 채널은 동시에 하나의 고루틴만이 내부 데이터에 액세스할 수 있도록 보장하여 개발자에게 우아하고 간단한 도구를 제공합니다. 따라서 Go의 기본 방법은 공유 메모리를 사용하는 대신 채널을 사용하여 통신하는 것입니다. 의사소통하다.

Peter_Zhu

전자는 모든 사람이 상태를 유지한다는 의미이고, 후자는 모든 사람이 상태의 사본을 유지한다는 의미라고 생각합니다.

洪涛

공유 메모리에는 동시에 데이터에 액세스하고 수정하는 여러 스레드가 포함됩니다. 데이터의 보안과 가시성을 보장하기 위해 잠금이 수행되어 병렬 처리가 직렬화로 바뀌고 CPU도 스레드로 사용됩니다. 잠그다. 방법을 변경하고 데이터의 복사본을 만드는 것이 좋습니다. 각 스레드는 하나의 작업을 완료하는 한 다른 스레드가 잠금을 잡을 필요가 없습니다. 동시성을 달성하기 위해 알림 형식으로 전달됩니다.

伊谢尔伦

사실 분산적인 관점에서 이해하면 더 명확해집니다.

예를 들어 두 프로세스 ab가 동일한 메시지 대기열에서 함께 작동하는 경우 공유 메모리를 사용하면 두 프로세스가 동일한 물리적 시스템으로 제한되어야 합니까? 그러면 통신의 의미가 크게 줄어듭니다.

설계 과정에서 메시지 큐에 읽기 및 쓰기 인터페이스만 제공되고 내부 구현에 대해 전혀 걱정할 필요가 없다면 메시지 큐가 공유 메모리처럼 보일 것입니다. 그러나 메시지 대기열은 소켓을 사용하여 통신할 수 있습니다.

그래서 위 문장에서 공유 메모리를 사용하여 통신을 구현하지 않는다는 것은 처음부터 프로그램을 단일 머신으로 제한하지 않고 통신을 사용한다는 의미, 즉 내부 구현을 캡슐화하고 인터페이스를 제공한다는 의미입니다. 해당 작업을 수행하려면

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!