메세지 큐와 세마포어
글쓴이: 하하 / 작성시간: 화, 2005/10/04 - 10:20오전
"메인 스레드가 msgsnd를 합니다.
똑같은 일을 처리하는 자식 쓰레드들이
msgrcv를 합니다."
1. msgrcv를 하는 자식 쓰레드들은 message queue에
데이터가 있으면 가져가서 일을 처리합니다.
이럴때. 문제가 있나요?
왜 이런 질문을 하는지는
세마포어와 메세지 큐를 같이 쓰는 다음과 같은 사용에 대해
이해가 안되서 그럽니다.
다시 맨 처음 예를 변경해 보면
"메인 쓰레드는 msgsnd를 합니다.
msgsnd를 한후 sem_post 를 합니다.
같은 일을 하는 자식 쓰레드들은 sem_wait을 한후
즉 하나의 쓰레드만이 제어권을 획득한후 msgrcv를
합니다."
여기서 세마포어를 굳이 사용해야 할 필요성이 있는지
묻고 싶습니다. 왜냐하면 같은 일을 처리하는 자식 쓰레드
들은 세마포어를 하던 말던 msgrcv를 할때 어자피 하나의
자식 쓰레드만이 msgrcv를 할 수 있지 않나요?
Forums:
Write/Read Lock
메인이 Write할 때와 자식이 Recv 할때 동기화에 대한 생각을 해보시는게 어떠실런지...
자식이 읽고 있는 중에 메인이 써버리면 어떻게 될까요???
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
Re: 메세지 큐와 세마포어
예 맞습니다. 메세지 큐에서 메세지를 가져가는 과정에서 세마포어를
사용할 필요가 없습니다. 서로 경쟁하는 자식 프로세스들이 있다고 하더라도 메세지를 가져갈때는 오직 하나의 프로세스만이 접근가능합니다
Re: Write/Read Lock
글쎄요.. 들어주신 예가 과연 적합한 예인지 의심이 드는군요
메인이 Write할때와 자식이 Recv할때 동기화가 필요한 경우는 공유 메모리와 같은 곳에서 특별한 경우(서로가 쓸수 있고 읽을수 있는 상황)에나 필요하지 처음 물어본 메시지 큐와는 전혀 관계가 없어 보이는데요.
메시지 큐에서 Write하고 있는 중간에 그 Write하고 있는것을 Recv를 할수는 없는것으로 알고 있습니다. Write와 Recv가 동시에 이뤄진다고 해도 현재 쓰고 있는 것을 Recv하는 것이 아닌 이전에 큐잉 시켜놓았던 것에 대해서 Recv하는거 아닌가요?
메시지 큐 사용하면서 세마포어를 사용하는것은 코딩 실수이거나 순수하게 메시지 동기화 부분이 아닌 다른 부분에서 필요했기 때문이 아닐까요?
그다지 있을것 같지는 않지만, 메시지 큐에 Write하고 있을때에는 어떤 특수한 이유로 이미 큐잉된 데이터라 할지라도 Read하지 못하게 해야할 경우같은...
제가 메시지 큐에 대해 착각을 했네요...죄송...
윗분 말씀대로 제가 뭔가 착각한것 같습니다.
이럴땐 정말 어디론가 숨고 싶다는 생각이 들지만... 이렇게 잘못을 인정하는것 또한 이곳에서 배울수 있는 하나라고 생각합니다.
충고 감사드립니다.
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
댓글 달기