생산자
소비자
이렇게 만들어서 쓰는데요 소비자 스레드가 하나면 잘 동작을 하거든요,,,,
근데 소비자가 여러개가 되면 소비자들끼리 막 경쟁하는거 같은데
제 생각엔 소비자에서 lock 걸었다가 wait하면서 lock 잠깐 반납하면 다른 스레드가 그 lock 가져가서 뭐가 문제가 생기는거 같은데
혹시 소비자가 wait 했을때 생성자가 무조건 lock 가져가게 하는 방법이 없나요?
아니면 소비자 스레드들마다 컨디션 변수를 다 다르게 해줘야하나요?
생산자
소비자
이렇게 만들어서 쓰는데요 소비자 스레드가 하나면 잘 동작을 하거든요,,,,
근데 소비자가 여러개가 되면 소비자들끼리 막 경쟁하는거 같은데
제 생각엔 소비자에서 lock 걸었다가 wait하면서 lock 잠깐 반납하면 다른 스레드가 그 lock 가져가서 뭐가 문제가 생기는거 같은데
혹시 소비자가 wait 했을때 생성자가 무조건 lock 가져가게 하는 방법이 없나요?
아니면 소비자 스레드들마다 컨디션 변수를 다 다르게 해줘야하나요?
멀티스레드 쓸건데 왜 mutex 를 쳐 걸어버린 겁니까??
저기서 enqueue / dequeue 연산이 공유자원이거든요,,, 그래서 저 명령 수행할땐 스레드들끼리 방해 못하게 막은건데 혹시 잘못된게 있을까요?
enqueue/ dequeue 를 굳이 생산-소비자 간에 공유자원으로 할 이유가 있나요? buffer 를 복사로 소비자에게 넘겨주고 생산자와 소비자xN 개의 동기화를 줄이는 방식으로 만들 순 없었나요?
그렇게 만드시면 소비자 1이 이슈를 해결하기 전 까진 뒤에 밀려있는 나머지 소비자와 생산자가 놀게되잖아요?
그러면 멀티스레드를 할 이유가 없죠
소비자들이 버퍼에 데이터가 있어야 작업을 할 수 있는데 첨부터 버퍼에 데이터를 다 넣은담에 넘겨주라는 말씀이신가요? 굳이 쓰레드 쓰지 말구요?
..... 제가 말을 좀 이상하게 했나보군요 그게 아니라 소비자가 한 100개가 나올거잖아요? 그러면 버퍼를 주소를 넘겨서 공유자원으로 소비자에게 넘겨주지 말고 버퍼를 복사해서 소비자 스레드에게 넘겨주세요 그러면 결론적으로 소비자의 요구만큼 버퍼가 복사될 것 이고 생성자와 각각의 소비자들이 lock unlock 을 반복 할 필요가 없이 스레드를 생성하고 파괴하면 그만 아닐까 해서요
제가 말한건 공유자원을 원천적으로 없애버리는 것 입니다. 공유자원은 A 스레드 B 스레드 C 스레드 가 서로 상호작용하며 한 자원에 대해 피드백을 할때 순서를 주며 뮤텍스, 세마포어를 걸어두는것으로 알고 있거든요 근데 말씀 하신건 1개의 생산자 다수의 소비자(멀티스레드) 개념이라 비동기로 처리 가능하지 않을까 해서요
데드락이라고하는데 정말 필요할때 써야됨
소비자 스레드가 여러개인데 왜 mutex를 씀??? 보통 semaphore 쓰지 않나
mutex로도 구현이 가능하고 세마포어로도 구현이 가능한걸로 알고있거든요,,, 무조건 세마포어로 해결해야하나요?