mutex 관련 질문
글쓴이: woosokie / 작성시간: 화, 2009/07/07 - 11:19오전
A,B라는 2개의 스레드가 있고
A 스레드에서 pthread_mutex_lock(), pthread_mutex_unlock()을 호출하며
루프를 돌고 있습니다. 루프는 unlock호출 후 바로 lock을 호출합니다.
문제는 다음과 같습니다.
A 스레드에서 lock이 호출 되어 작업이 이루지는데
B 스레드에서도 lock을 시도하여 B 스레드는 멈추어 있는 상황입니다.
A 스레드가 unlock을 호출하면 바로 B 스레드가 작업을 시작할 줄 알았는데
계속 A 스레드에서만 작업이 이루어지네요.
그래서 미봉책으로 A 스레드의 unlock 이후 sleep(0)으로 해결했는데....
왜 B 스레드에서 lock이 걸려 있는데 A 스레드에서만 작업이 이루어질까요?
또 sleep()말고 좋은 해결책은 없을까요?
Forums:
sched_yield
대부분의 경우 (load가 아주 높지 않으면) 그냥 맘편히 기다리시면 언젠가 B 스레드가 작업을 시작할 것 같다는... 느낌이.. 듭니다. (장담은 못하겠군요.)
Mutex는 공평함을 보장하지 않습니다. 만약 로직이 "A가 작업을 끝냈을 때 B가 기다리고 있으면 반드시 B가 작업을 시작해야 한다"라면 다른 방법을 사용해야 합니다.
저도 같은 생각입니다.
우선순위 문제가 아닐까 싶내요 ^^
============================
Stay Hungry, Stay Foolish
============================
Stay Hungry, Stay Foolish
같은생각 2
mutex가 공평함을 보장하지 않는것은 맞습니다.
A만 계속 실행될 수도 있는것이죠.
A와 B가 공평하게 실행되길 원하신다면 A가 끝나는것을 B에 알려주는 방법을 사용하시는게 어떨까요.
http://tong.nate.com/heheya/32698392
==
MP
MP
네. 답글
네. 답글 감사합니다.
mutex에 대해 공평함(?)을 보장하는줄 알았습니다.
A가 끝나는걸 B에 알려주는 방법으로 Semaphore를 통해
해결 했습니다.
Semaphore 를
구현 방법에 따라 다르겠지만..Semaphore 자체가 답이되진 못합니다.
여전히 동일한 문제가 발생할 수 있으며. Semaphore든..
전역변수든 자신이 수행후 다른쓰레드의 작업이 없이는 재lock을 할 수 없는 구조로했다면
문제는 해결가능합니다만 그건 궂이 Semaphore가 문제 해결책 이라기보다 조건재진입으로 구현한것으로 볼 수 있겠네요..
conditional variable을
conditional variable을 써서 thread A가 thread B를 깨우는 형태로 바꿔보기 바랍니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
unlock 후 바로 lock을
unlock 후 바로 lock을 걸경우.. 한 쓰레드가 수행되다가 다른 쓰레드에게 자원이 넘어갈 틈이 없기때문에 대부분비슷한 현상을 보일겁니다.
정확한 수행의 순서가 필요한것이 아니라면.. sleep을 사용하시면 될듯합니다.
pthread_yield() 함수를 쓰면 다른 스레드가 실행하지 않을까요?
제 생각에 조건변수를 써도 마찬가지일듯하네요
pthread_yield() 함수를 쓰면 다른 스레드가 실행하지 않을까요?
(저는 사용을 안해봤습니다만.. )
=====================
=====================
조건 변수를 써서
조건 변수를 써서 wait, signal을 사용하면 명시적으로 B thread를 실행할 수 있습니다.
대신 조건 변수를 사용할 때는 A, B thread의 동작 절차 및 순서를 확실히
설계한 후에 사용하여야 오류로 고생하는 일이 없을 것 같네요.
댓글 달기