2009-08-30 2 views
4

여러 생성자와 여러 소비자간에 공유되는 대기열 리소스가 있습니다. 모두는 독립적 인 프로세스입니다. 아무도 프로세스가 대기열을 "소유"하지 않습니다.다중 프로세스 동기화 - 세마포어보다 나은 선택입니까?

구현의 본질에 따라 큐에 대한 액세스가 제어되어야하며 주어진 순간에 하나의 프로세스 만 밀어 넣거나 팝 할 수 있어야합니다.

세마포어라는 POSIX를 사용하여 올바른 해결책이 될 것이라고 생각했지만, 세부 사항 중 일부는 나를 귀찮게합니다. (이것은 리눅스 전용 구현입니다.)

  1. sem_unlink를 사용해야하는시기는 언제입니까? 큐를 실제로 제거 할 이유가 있습니까?

  2. 대기열 세마포를 잠근 상태에서 프로세스가 죽어가는 것이 걱정됩니다. 이 주변에 좋은 방법이 있습니까? 잠금을 얻으려고 할 때 시간 초과 대기를 할 수 있지만 시간 제한이 만료되면 이제 경쟁 상태가됩니다.

  3. 간단한 바이너리 잠금에 대한 더 나은 해결책이 있습니까? 아마도 fcntl 및/또는 exclusive를 사용하는 lockfile이 열릴 것입니까?

답변

3

파일 잠금은 예기치 않은 프로세스가 종료 된 경우 잠금을 해제하는 이점이 있습니다. 나는 그들이 당신의 시나리오에 가장 적합하다고 생각합니다.

그들이 지원하는 좀 더 복잡한 의미가 필요할 때 세마포어를 사용한다고 상상할 수 있습니다. (당신이 염두에두고있는 뮤텍스 사용법을 지원하는 것 이상을 지원합니다.)하지만 사용하면 시간이 지나면 가사를 수행 할 수있는 방법이 필요합니다. 죽음. Windows에서 Lotus Notes에는 "ZapNotes"가정부가 있습니다. 가정부는 "발생하지 않아야합니다"시나리오에서 유사하다고 가정합니다.

+0

이들은 서비스 기반 앱이므로 "KillNotes"(여기서는 여러 번 사용 했음)가 여기서 작동하지 않지만 제안 해 주셔서 감사합니다. – Joe

+0

실제로 파일 잠금을 사용하는 것이 좋습니다. KillNotes와 같은 하우스 키핑 kluges의 필요성 때문에 나는 sempahores를 사용하는 것을 꺼려합니다. – djna

+0

죄송합니다. 귀하의 의도를 이해했으며, 제 응답에 명확하지 않았습니다. – Joe

관련 문제