[완료] 쓰레드 2개가 서로를 블럭시키면서 돌게 하려면..
글쓴이: nekoko / 작성시간: 월, 2011/07/11 - 5:21오후
쓰레드 2개가 각각 돌고 있고요,
한쪽이 데이터를 생성하면 다른 스레드가 그것을 처리하는 식입니다.
그런데 데이터가 다 처리되기 전에 데이터가 생성되면 안됩니다. (겹치니까요..'ㅅ')
데이터가 다 처리되면 그제서야 데이터가 생성되야 하구요.
데이터가 생성되면 그걸 처리하고..
이런 식인데 뮤텍스 가지고 해보려고 했는데 잘 안되네요
뮤텍스를 2개 써야 하나..싶은데 왠지 이상한 것 같고요
보통 이런 경우 깔끔하게 어떻게 처리하나요?
Forums:
뮤텍스 하나로 메시지 큐를 만들고, 큐 사이즈를 1로
뮤텍스 하나로 메시지 큐를 공유하도록 만들고, 큐 사이즈를 1로 하면 되지 않을 까요?
물론 해보진 않았습니다^^;
——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -
이런 경우에는
가장 깔끔한 방법은 하나의 쓰레드로 하는 겁니다.
while(1) {
데이터 생성
|
V
데이터 처리
}
두개의 thread로 구현하면 mutex가 아니라 binary semaphore를 2개 쓰면 됩니다.
binary_sem1 기다리기
데이터 생성
binary_sem2 주기
binary_sem2 기다리기
데이터 처리
binary_sem1 주기
C++ 이라면 TBB를 사용해 보세요
일단 TBB를 쓸수 있는 환경이면 쉽게 처리할 수 있을거 같은데요?
결국, 쓰레드 A,B가 있다면, A는 생성하는놈, B는 처리하는 놈
쉽게 얘기하면, A는 쌓고, B는 빼고 인데, 여기서 Stack이든 Queue든 Thread safe 하면 되는것.
이게 맞다면, TBB를 사용해서 쉽게 처리할 수 있습니다.
concurrent_bounded_queue 를 사용해서 처리하면, lock-free 하게 Push,pop을 여러 Thread에서 할 수 있습니다.
넣을 놈 A
처리할 놈 B
concurrent_bounded_queue 는 pop할게 없을 경우 다음 Push가 있을 때까지 block되어 있습니다.
즉 뺄게 없으면 block 상태를 유지합니다.
時日也放聲大哭
해결된 것 같습니다.
C라서요,, 'ㅅ'
2개의 binary semaphore로 일단은 잘 동작하는 것으로 보입니다.
리플 감사합니다.
"I'm convinced that the only thing that kept me going was that I loved what I did." - Steve Jobs 1955-2011
댓글 달기