>  기사  >  백엔드 개발  >  간단한 Go 시뮬레이션 - 동시성 문제

간단한 Go 시뮬레이션 - 동시성 문제

PHPz
PHPz앞으로
2024-02-09 14:10:10674검색

간단한 Go 시뮬레이션 - 동시성 문제

php 편집기 Xinyi는 "동시성 문제"라는 간단하지만 흥미로운 Go 시뮬레이션 게임을 제공합니다. 이 게임은 동시 프로그래밍을 테마로 하여 플레이어가 가상 세계에서 동시 프로그래밍의 매력을 경험할 수 있도록 해줍니다. 게임에서 플레이어는 여러 작업의 동시 실행을 처리하고 동시 프로그래밍 능력을 테스트하기 위한 코드를 작성해야 합니다. 게임 인터페이스는 간결하고 명확하며 조작이 간단하고 초보자가 시작하기에 적합하며 플레이어가 선택할 수 있는 다양한 난이도와 도전 모드도 제공합니다. 초보자든 숙련된 개발자든 이 시뮬레이션 게임에서 동시 프로그래밍의 즐거움을 누릴 수 있습니다.

질문 내용

저는 폴란드에서 온 학생이고 이번 학기에 동시 프로그래밍 과정(Go, Ada 및 향후 일부 이론 및 CSP 언어)을 시작했습니다. 솔직히 말해서 Golang은 흥미로워 보이지만 약간 혼란스럽습니다. 가장 중요한 것은 제 경험상 저는 제 자신을 평균 이하의 프로그래머라고 부를 것입니다. 기본적으로 제 임무는 시뮬레이션을 만드는 것인데, 이에 대해 다음과 같이 설명하겠습니다.

  • n*m 그리드가 있습니다

  • 여행자는 무작위로 생성될 수 있습니다. 최대 k명의 여행자, 각 여행자는 고유한 ID를 갖습니다(1, 2, 3 등, 최대 k명)

  • 무작위의 순간에 공간이 비어 있으면(확실히 여유 공간은 0일 것입니다) 여행자는 그리드에서 위, 왼쪽, 오른쪽 또는 아래로 이동할 수 있습니다

  • 메쉬의 현재 상태와 최근 움직임을 인쇄하는 카메라도 있습니다(아직 구현되지 않음)

  • 비공식적으로는 무슨 뜻이든 채널을 사용해야 한다고 들었습니다

내 생각은 각 여행자의 ID와 좌표로 구조를 만들고 이동 의지를 나타내는 채널에 그들의 ID를 보낸 다음 이동 방향을 무작위로 선택하는 것입니다.

저는 동시성에 대해 약간 혼란스럽습니다. wgs와 뮤텍스를 사용해야 하는지, 어디에 사용해야 하는지 뿐만 아니라, 예를 들어 func(){}를 사용하는 경우 루프가 내부에 있어야 하는지 외부에 있어야 하는지도 알 수 있습니다. 내 코드를 수정하기 위한 팁, 도움말 또는 수정 사항/아이디어를 주시면 매우 기쁘게 생각합니다. 추측한 대로 코드가 제대로 작동하지 않기 때문입니다(예: 카메라가 그리드를 인쇄할 때 때로는 k명 이상의 여행자가 있는 경우도 있습니다. 여행자들은 같은 번호를 공유하고 때로는 사라지는 것 같습니다). 모두들 즐거운 하루 보내시기를 바라며 도움을 주시면 정말 감사하겠습니다 :)

으아악

WGS, 뮤텍스, 원자 등 모든 아이디어에 약간 압도당했습니다.

솔루션

  • 작업을 동시에 처리하려는 경우(예: 카메라 스냅샷 촬영과 여행자 이동이 동시에 발생할 수 있음) 고루틴은 경량 스레드입니다.
  • 채널은 Go 루틴 간에 데이터를 전송하는 데 사용됩니다.
  • Mutex는 경쟁 조건을 피하기 위해 고루틴이 독점 데이터 액세스를 위해 공유 데이터에 잠금을 추가할 수 있도록 하는 데 사용됩니다.

그 말은:

  • 한 고루틴에서 카메라 스냅샷을 실행하는 동시에 여행자가 다른 고루틴에서 이동하도록 하는 것이 좋아 보입니다. 고루틴을 생성하는 것은 불필요합니다. 한 번만 수행하면 되므로 기본 고루틴에서 실행할 수 있습니다.
  • 귀하의 경우에는 채널이 아무런 도움이 되지 않습니다. 메시지를 생성하고 이를 채널을 통해 이동을 수행할 다른 고루틴으로 보내는 고루틴이 있습니다. 이 모든 작업을 단일 고루틴에서 순차적으로 수행하고 불필요한 복잡성을 피할 수 있습니다. 채널은 다양한 사용 사례에 유용하지만 여기서는 중복됩니다.
  • 공유 메모리(그리드)에 액세스하는 두 개의 고루틴이 있으므로 경쟁 조건을 방지하려면 뮤텍스가 필요합니다. 이들 중 하나가 실행될 때마다 "잠금"하고 작업을 완료한 다음 "잠금 해제"해야 합니다. 잠금을 획득한 첫 번째 고루틴이 잠금 해제될 때까지 다른 고루틴은 잠금 단계에서 차단됩니다. 읽기/쓰기 잠금을 사용하면 더욱 최적화할 수 있습니다(읽기 잠금은 카메라에만 필요하고 읽기/쓰기 잠금은 모바일 코루틴에만 필요함)
  • 더 많은 무작위성을 원한다면 각 여행자를 위한 고루틴을 만들 수 있습니다.

위 내용은 간단한 Go 시뮬레이션 - 동시성 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제