2009-05-15 4 views
1

예를 들어, Windows에서 Windows 메시지, 소켓 이벤트, 비동기 I/O (IOCompletionRoutine) 및 뮤텍스 핸들을 비동기 적으로 기다릴 수있는 MsgWaitForMultipleObjects가 있습니다.pthread를 사용하여 플랫폼에서 비동기 스레드 간 통신을 수행하는 방법

유닉스에서 일부 pthread_mutex가 잠금 해제 될 때 탈주 가능성을 제외한 모든 것을 제공하는 선택/폴링이 있습니다.

이야기 :

내가 여러 소켓, 파이프 또는 파일에 무언가를 메인 스레드를 가지고 응용 프로그램이 있습니다. 이제는 종종 시간이 걸릴 수있는 부업 (db 트랜잭션)이 있으며 때때로 주 스레드에서 동 기적으로 완료되면 소켓의 정상적인 서비스가 중단됩니다. 그래서 별도의 스레드에서 DB 작업을하고 싶습니다. 그 스레드는 유휴 상태 일 때 메인 쓰레드가 어떤 일을하기로 결정할 때까지 뮤텍스를 기다리고 뮤텍스를 풀어서 db 쓰레드가 그것을 잡을 수있게한다. 문제는 db 스레드가 주 스레드가 작업을 완료했다는 것을 어떻게 알릴 수 있는지입니다. 주 스레드는 소켓을 처리해야하므로 pthread_mutex_lock에서 절전 할 여력이 없습니다. 주기적으로 pthread_mutex_trylock을하는 것은 내가하고 싶은 마지막 것입니다. 현재 파이프 사용을 고려하고 있지만 이것이 더 좋은 방법입니까?

답변

1

파이프를 사용하는 것이 좋습니다. 다른 프로세스에 파이프의 쓰기 끝이 열려 있는지 확인한 다음 주 스레드에서 read() 또는 read()를 선택하여 읽습니다. 작업자 스레드가 작업을 완료하면 쓰기 종료를 닫습니다(). 주 스레드의 select()는 즉시 깨어납니다.

Linux에서 뮤텍스가 파일 설명자를 지원하지 않는 futex (2) 시스템 호출로 구현 되었기 때문에 mutex에서 대기 중이며 다른 것이 가능할 것이라고 생각하지 않습니다.

+0

네, 질문은 파이프보다 더 저렴한 것입니다. –

+0

pts가 맞으면 파이프를 사용하십시오. 그것은 당신이 묘사 한 것을 (선택/폴링/큐큐 모델) 꽤 잘 맞 춥니 다. –

0

특정 문제에 얼마나 잘 적용되는지 모르지만 posix는 message queues입니다.

관련 문제