CPU에 의해서 한개의 스레드만 활성화 되는것이 아니라, 전체다 수행하게
됩니다. 스레드 mutex를 이용해서 스레드를 처리 하세요.
스레드를 어느 부분에서 wait시키시려고 하는지는 모르겠지만
만약, 순차적인 스레드의 활성화가 필요하다면 다른 로직이 필요할것
입니다.
스레드에 signal를 활용하는 방법은 적절치 않다고 봅니다.
초보 wrote..
스레드에서 브로드캐스트로 시그널을 보내면
conditin variable에 의해 시그널을 wait하던 스레드들이 모두 시그널 을
받는다고
하는데 그렇다면 , 그중에서 cpu에 의해 임의로 선택된 하나의 쓰레드만 이
블록상태에서 깨어나 수행하게 되나요?
그렇지 않습니다. 모든 thread가 깨어납니다.
모든 thread가 깨어나긴 하는데 pthread_cond_wait() 함수 호출을
끝내고 리턴할 때에는 함수 호출시 unlock시켰던 mutex를 다시 lock하게
되어 있습니다. 그래서 맨 처음 깨어난 녀석만 성공적으로 해당 mutex를
lock시키고 다음 문장을 수행할 수 있는 것이고, 다른 모든 녀석들은
mutex의 lock에 대기하고 있는 상태가 됩니다.
(이걸 깨어난 상태가 아니라고 말씀하시면 그럴수도 있겠지만,
이번에는 cond가 아니라 mutex에서 block되어 있는 것입니다.)
위와 같은 코드에 10개의 thread가 걸려있다고 하면 10개 모두
"짹!" 소리를 낼겁니다. thread가 cond에서 깨어났다는 것을뜻하죠.
printf("짹!\n") 앞에 sleep(5); 정도 주면
5초마다 한번씩 '짹!' 하는 소리를 들을 수 있을 것입니다.
이건 cond에서 깨어났지만 mutex에서 block되어 있고,
맨처음 mutex를 잡은 녀석이 5초간 sleep하고 있기 때문에
다른 녀석들이 block되어있는 것입니다.
Re: 스레드 질문입니다. pthread , condtion 과 broadcast signa
CPU에 의해서 한개의 스레드만 활성화 되는것이 아니라, 전체다 수행하게
됩니다. 스레드 mutex를 이용해서 스레드를 처리 하세요.
스레드를 어느 부분에서 wait시키시려고 하는지는 모르겠지만
만약, 순차적인 스레드의 활성화가 필요하다면 다른 로직이 필요할것
입니다.
스레드에 signal를 활용하는 방법은 적절치 않다고 봅니다.
초보 wrote..
스레드에서 브로드캐스트로 시그널을 보내면
conditin variable에 의해 시그널을 wait하던 스레드들이 모두 시그널 을
받는다고
하는데 그렇다면 , 그중에서 cpu에 의해 임의로 선택된 하나의 쓰레드만 이
블록상태에서 깨어나 수행하게 되나요?
Unix signal이 아니고, cond_signal을 말하는겁니다.
mutex와 condition variable을 사용중에
condition variable조건때문에 block되어 cond-signal을 기다리고 있을때
어떤 다른 스레드가 브로드캐스트 시그널을 날리면 cond-signal을 기다리
면서 블록되어있던 다수의 스레드중 하나만이 깨어나서 실행되는가?
아니면 모두 동시에 깨어나서 실행된다면 mutex lock을 동시에 얻는경우는
있을수 없는경우자나요..
다시정리할께요.
mutex를 얻은후 컨디션 시그널을 기다리면서 블록되어있는 복수개의 스레
드가 존재할때 제 3의 스레드에서 컨디션 브로드캐스트 시그널을 날리면
기다리고 있는 복수개의 스레드가 어떻게 반응하냐는것이죠.
참고하셔요..
http//www.joinc.co.kr/modules.php?name=News&file=article&sid=50
Re: 스레드 질문입니다. pthread , condtion 과 broadcast signa
그렇지 않습니다. 모든 thread가 깨어납니다.
모든 thread가 깨어나긴 하는데 pthread_cond_wait() 함수 호출을
끝내고 리턴할 때에는 함수 호출시 unlock시켰던 mutex를 다시 lock하게
되어 있습니다. 그래서 맨 처음 깨어난 녀석만 성공적으로 해당 mutex를
lock시키고 다음 문장을 수행할 수 있는 것이고, 다른 모든 녀석들은
mutex의 lock에 대기하고 있는 상태가 됩니다.
(이걸 깨어난 상태가 아니라고 말씀하시면 그럴수도 있겠지만,
이번에는 cond가 아니라 mutex에서 block되어 있는 것입니다.)
pthread_mutex_lock(&mutex);
while (count <= 0) {
pthread_mutex_cond(&cond, &mutex);
printf("%d 짹!\n", (int)pthread_self());
}
pthread_mutex_unlock(&mutex);
위와 같은 코드에 10개의 thread가 걸려있다고 하면 10개 모두
"짹!" 소리를 낼겁니다. thread가 cond에서 깨어났다는 것을뜻하죠.
printf("짹!\n") 앞에 sleep(5); 정도 주면
5초마다 한번씩 '짹!' 하는 소리를 들을 수 있을 것입니다.
이건 cond에서 깨어났지만 mutex에서 block되어 있고,
맨처음 mutex를 잡은 녀석이 5초간 sleep하고 있기 때문에
다른 녀석들이 block되어있는 것입니다.
댓글 달기