지금 만들고 싶은게
producer 스레드 하나가 자료구조에 계속 데이터를 채워 넣으면 consumer 클래스가 중복되지 않게 데이터를 빼가서 처리하는 자료구조를 구현하고싶음
근데 성능에 민감해서 consumer가 자료 빼가는걸 락 안잡고 빼가게 만들고싶음...
처음 생각한 아이디어는 배열 잡고 스레드마다 id 부여한다음 자기 id를 인덱스로 해서 빼가게 할까 생각해 봤는데 총 처리해야 될 데이터 갯수가 엄청나게 커지면 불가능할거같아서 엎어졌고
그다음은 큐를 써볼까 했는데 dequeue 오퍼레이션을 스레드 세이프하게 만들수 없을거같아서 난관에 봉착했음
producer-consumer 문제로 구글링해보면 꽤 많이 보이는데 다 consumer거 락잡고 빼가는 모델밖에 없는거같은데 혹시 이런거 어케 해결하는지 아시는분?
https://github.com/cameron314/readerwriterqueue
+
ㄱㅅㄱㅅ
lock-free queue
오 한번 찾아볼게요 감사합니다
Boost.Lockfree 검색ㄱ
근데 진짜 뮤텍스로는 감당이 안될 성능이 안나오는거 맞음? 프로파일링 해봄?
정확히 프로파일링은 안해봤는데... 다뤄야할 데이터가 많아서 뇌피셜로는 안될것같더라구요 이왕 짤거 락프리로 짜보려고 했죠
더 보고 싶으면
https://en.wikipedia.org/wiki/Test-and-set랑
https://en.wikipedia.org/wiki/Compare-and-swap
참조
정확한 방식은 락을 써서 해결하고 성능이 부족하면 그때 방법을 찾는게 나음
윈도우 기준 SRWLOCK을 쓰거나, 운영체제 상관없이 쓰려면 스핀락써서 만들면됨
non-blocking알고리즘을 쓴다고 반드시 빨라질거라고 생각할 수 없음
윈도우기반이라면 이미 만들어져있는 IOCP를 큐로 사용해도됨
그리고 락프리큐를 구현하려면 ABA문제를 방지하기 위해 메모리풀을 만들어서 써야하는데, 메모리풀을 잘못만들면 또 느려질 수 있음
그런데 부정적으로 말하긴 했는데, 메모리풀 + 락프리큐 구현 해보면 재밌긴할거임
"FormalVerificationofa PracticalLock-FreeQueueAlgorithm"란 논문을 찾아보면 정확하게 동작하는 수도코드를 볼 수 있을것임
네 감사합니다 말씀드린것들 참고해서 만들어보겠습니다!