> 백엔드 개발 > Golang > 달리기 경주 조건

달리기 경주 조건

王林
풀어 주다: 2024-02-08 21:00:04
앞으로
1233명이 탐색했습니다.

달리기 경주 조건

질문 내용

코드 실행시 가끔 Attack() 함수에 소요된 시간이 출력되는 경우가 있습니다. 공격이 채널에 쓰고 메인이 이를 읽은 다음 메인이 종료되고 타이머("공격")가 실행될 때까지 기다리지 않으면 경쟁 조건이라는 것을 알고 있습니다

저는 처음 왔습니다 :_)

으아악

누군가 이 상황을 처리하는 방법을 알려줄 수 있습니까? 두 기능에 소요된 시간을 인쇄하고 채널을 사용하고 싶습니다.


정답


main 退出时,程序将终止,并发 goroutine 不会正常终止(在许多程序中,非主 goroutine 是辅助“守护进程”,根本不会关闭),因此不能保证现有的 defer 会运行。这就是这里发生的情况:当您发送烟雾信号时,如果 attack goroutine 被取消调度,那么 main 可以在重新调度之前返回,因此 defer이 실행되지 않습니다.

이 문제를 처리할 수 있는 옵션은 많지만 모두 기본적으로 동일한 결과를 가져옵니다. 기능이 실행된 후에 채널을 보내야 합니다. , 예를 들어(완전하지는 않음)를 통해 이 작업을 수행할 수 있습니다.

  • 타이머가 끝나기 전에 메시지 보내기를 연기하세요(역순으로 실행을 연기하세요)
  • 하위 함수의 defer(), 외부 함수의 신호
  • 지연을 사용하지 말고 신호를 보내기 전에 종료 메시지를 실행하세요
  • 메시지를 보내고 인쇄하는 것을 별도로 보내는 대신 채널을 통해 함수의 런타임을 보내고 호출자가 형식을 지정하고 보고하도록 하세요

위 내용은 달리기 경주 조건의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿