[완료] 수시로 바뀌는 파일 디스크립터를 정확하게 쓰레드로 넘기는 방법
글쓴이: whxoans / 작성시간: 목, 2008/12/18 - 12:04오후
메인 쓰레드에서 accept로 접속을 기다리다
accept 직후 thread를 생성하고 그 쓰레드의 인자값을 accecpt를 한 socket의 file discriptor로 넘기고 있습니다.
문제는 accept 직후에 file discriptor를 thread로 넘기는 방법으로
Quote:
이런식으로 넘기는데pthread_create(,,,&fd)
thread가 fd를 받기전에 값이 바뀌는 경우가 생긴다는 겁니다.
이런 경우에는 어떻게 처리가 가능한지 질문 드립니다.
Forums:
^^;
queue를 활용해보시는건 어떤신가여
queue check thread를 만드셔서 queue에 push시 이벤트 발생해서 pop 후 쓰레드 생성
이렇게 해보시면 쉽게 해결될거라 생각듭니다.
그럼
...
fd라는 변수를 재활용하시나 보죠? 저러면 fd의 값이 아니라 fd의 *주소*를 넘기는 건데 쓰레드가 동작을 시작하기 전에 accept를 한번 더 불러 버리면 fd의 값이 바뀔 테니 당연히 쓰레드에서 제대로 된 값을 읽을 수가 없죠.
엄밀하게 말해서 C 표준을 준수한다고 하기는 힘들지만, 그냥 (void *) fd로 넘기고 받는 쪽에서 거꾸로 typecasting하시면 될 겁니다.
제가 질문의 의도를 잘 못 설명드린거 같습니다.
type이 문제가 되는 것이 아니라
차일드 쓰레드에서 참조하고 있는 메인 쓰레드에 있는 변수가 어느 시점에 값이 바뀔지 모르니
이것을 차이들 쓰레드에서 특정 작업이 끝날때까지 바뀌지 않게 하거나 하는 등의 방법을 몰라
질문 드린겁니다~
결국 타이밍의 문제를 말씀드린겁니다.
주소를 넘기면서
주소를 넘기면서 아무런 조치도 취하지 않으니 그 주소에 담긴 값이 변하는 것이라는 설명이고요.
이것저것 처리하려면 비용이 비싸질 수 있으니 주소대신 값을 직접 넘기는 꼼수가 어떻겠냐고 조언해주신겁니다.
국어가 너무 어려워서 글로 쓰면 잘 전달이 안되니 코드로 보여주시기 까지 했는데,
글은 보지도 않고 코드만 보곤 웬 동문서답이냐라고 댓글다시면 곤란하죠.
OTL
죄송합니다.
말씀하신대로 저야 말로 동문서답을 한 격이 되었네요;;
위처럼 처리해서 정상 처리 되는 것을 확인하였습니다.
이놈의 덤벙댐은;;;;
jick 님의 댓글에
jick 님의 댓글에 동감합니다. 좀 간질간질하죠 ^^
언젠가 두드렸던 코드 조각
대강 이렇게
OTL
C표준 따르려면
사실 void*가 int형보다 크다는 보장이 C에서는 없기 때문에 malloc한 다음 그 메모리에 fd를 저장해서 쓰레드에 보내는 것이 원칙입니다. (void*)fd를 하면 값에 의한 복사가 되어서 잘 넘어가죠.
위에분이 잘 설명해 주셨는데 동문서답이라 하시니 그러네요 좀..
댓글 달기