2013-03-24 3 views
2

이 완료 객체에 호출되는이 완료 객체에 wait_for_completion()을 할 얻는 작업 전에 (작업 B에서)? 객체가 이미 대기 시간에 완료되었는지 즉시 확인할 수있는 API가 있습니까? 한 가지 방법은 메시지를 보내기 전에 잠긴 mutex을 사용하고 대기 전에 잠금을 해제 할 수 있습니다. 그 자물쇠는 complete_all() 전에 취득해야하고 후에 풀어 놓고 그러나 더 청결한 더 나은 방법이 있는지 생각해 볼 필요가있다. 어떤 아이디어라도 환영합니다.완료 객체 경쟁 조건

추가 컨텍스트 :태스크가가 완료 객체를 초기화가 완료 객체의 주소와 함께 태스크 B에 요청을 전송하고 종료를 기다린다. 작업 B은 메시지를 가져올 때 처리를 수행 한 다음 완료 개체에 complete_all()을 수행합니다.

+1

커널이 이미이 사건을 처리하고 있습니다. –

답변

2

특정 완료 개체에 대해 wait_for_completion() 전에 complete() 또는 complete_all()이 호출 된 경우 즉시 wait_for_completion()이 반환됩니다. 완료 객체 대략 세마포어 같다 :

  • 내부적으로 완료 객체 done > 0까지 0

  • wait_for_completion() 잠 초기화되는 done 카운터를 갖는다 (또는 done보다 이미 크면 즉시 진행 0), 반송하기 전에 원자 적으로 done을 감소시킵니다.

  • complete() 씩 증가 donewait_for_completion()에서자는 첫 번째 프로세스가 깨어납니다.

  • complete_all() 세트 doneUINT_MAX/2에 (효과적으로 무한대)와 wait_for_completion()에서자는 사람을 깨어.

귀하의 질문을 올바르게 이해하고 있다면 추가적인 잠금이 필요하지 않습니다. 완료 개체의 내부 wait.lock 스핀 록은 이미 카운터 액세스를 동기화하므로 걱정되는 사례가 올바르게 처리됩니다.