글쓴이: 익명 사용자 / 작성시간: 수, 2020/10/28 - 2:53오후
멀티스레드 시뮬레이터를 짜야합니다. 스레드간의 데이터 의존성은 없지만 작업이 모두 끝났으면 메인 스레드가 지시하기 전까지 기다려야 합니다. 조건 변수를 이용할려고 해봤지만 반드시 뮤텍스가 걸려있어야 해서 불가능합니다. 스레드를 매번 생성하는 방법도 있지만 오버헤드가 너무 큰 작업입니다. 재귀적인 생성도 답은 아닌 것 같고 모든 스레드를 무한한 시간동안 대기시키기만 하면 됩니다. 방법이 없을까요?
dummy 뮤텍스와 함께 조건 변수를 사용하시는 것이
dummy 뮤텍스와 함께 조건 변수를 사용하시는 것이 원하시는 답일 수 있습니다.
필요한 조건이 어떤 건지 잘 모르겠네요.
필요한 조건이 어떤 건지 잘 모르겠네요.
기본적으로 쓰레드가 무한 루프가 있는 형태인지 그냥 끝나는 형태인지 확인이 필요합니다.
아마 semaphore broadcast 같은 구조가 필요할 것 같네요.
스레드는 끝나는 형태는 아니고 무한 루프의 형태입니다
스레드는 끝나는 형태는 아니고 무한 루프의 형태입니다. 따로 알아서 종료하지는 않고 메인 스레드가 다 관리합니다.
라운드 로빈 방식인지, 우선 순위 방식인지 모르겠지만
라운드 로빈 방식인지, 우선 순위 방식인지 모르겠지만
식의 구성을 생각해 볼 수 있겠습니다.
...
> 조건 변수를 이용할려고 해봤지만 반드시 뮤텍스가 걸려있어야 해서 불가능합니다.
Condition variable은 wait 상태에 들어가면 뮤텍스가 풀립니다. 여기에다 notify_all을 쓰면 원하는 상황에 딱 맞을 것 같은데요, 안되는 이유라도..?
pipe, socket, message queue또는 pthread_kill
pipe, socket, message queue또는 pthread_kill()/pthread_sigmask()를 이용하여 thread간 동기화를 할 수 있습니다. 근데, 저도 왜 mutex를 못쓰시는지 궁금하네요. conditional_variable이 가장 편할텐데요.
man 7 mq_overview
man 7 pthread
man 7 pipe
man 7 socket
뮤텍스를 획득하지 않은 상태로 조건 변수를 기다리면 안되지 않나요?
man에서는 정의되지 않은 동작이 발생한다고 하는데 정말로 정의되지 않은 동작이 지금 발생하고 있어서요...
...
정확히 안되는 부분이 뭔지 잘 모르겠는데, condition variable은
* 일단 뮤텍스를 걸고
* cv.wait()를 실행하면
* 내부에서 atomic하게 뮤텍스를 풀고 기다리다가, cv에 신호가 오면 다시 뮤텍스를 건 다음 걸린 상태로 리턴합니다.
* 리턴을 받은 쪽에서는 뮤텍스가 걸려 있으니까 안심하고 자기가 기다리던 조건이 만족하는지 재확인한 다음, 상황에 맞게 다시 cv.wait()를 부르거나 뮤텍스를 풀고 하고 싶은 걸 하면 됩니다.
그러니까, cv.wait()를 부를 때 뮤텍스를 안 걸고 부르면 당연히 안됩니다.
네 제가 말한 부분이 그거였습니다
뮤텍스가 필요하지 않아서 답변대로 더미 뮤텍스를 사용하고 조건변수를 기다리는 식으로 땜빵했었는데 나중에 뮤텍스를 사용해야 되는 순간이 오니까 데드락이 걸리더군요. 이 부분은 다른 뮤텍스를 만들면 해결될까요?
mutex 한 개로 데드락을 유발할 수 있는 방법은
mutex 한 개로 데드락을 유발할 수 있는 방법은 한 개 뿐입니다.
mutex 가 non-recursive 로 설정된 상태에서, 같은 쓰레드에서 lock 만 중복해서 시도하는 경우.
https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html#sync-ex-23 에 condvar 를 사용할 때 mutex 를 어떻게 해줘야 하는지 예제가 있습니다.
댓글 달기