multithread queue 함 만들어봤습니다.

해저드 포인터로 dequeue 를 살짝 빠르게 했고

interlockedExchange 로 enqueue 를 상당히 빠르게 만든다음 주변을 손봤습니다.

제 컴에서는 몇가지 주워다 쓴거보다 빠르게 입출되긴 합니다.

(제약조건 몇개가 빠졌으니 당연하게도.)


쓰레드가 new delete 되면서 dequeue 에 엑세스 하려면

고정된 넘버를 delete 없는 list 나 array 에 interlocked 함수들로 값을 확정해서 가져오면 될 겁니다.

물론 dequeue 시간이 늘어날거고 현재도 dequeue 가 enqueue 에 비해 2배정도 느리기 때문에

권장될만한 상황은 아닙니다.


hazard 클래스에서 garbage 함수들의 함수명이 영 어색한데 좋은 의견 있으시면 경청하겠습니다.


2 Likes

__declspec(align)을 쓰지 않아도 C++11에는 alignas라는 좋은 키워드가 있습니다.
interlocked 계열 대신 std::atomic을 사용하면 플랫폼 종속성을 제거할 수 있습니다.

C++에서 volatile은 리오더링에 관여하지 않습니다.
자세한건 슭의 개발 블로그: [C++] volatile 를 참고하시기 바랍니다.

3 Likes

또한 최적화를 위해 메모리를 최대한 해제하지 않게 하는 것이 좋습니다.
메모리의 할당/해제 연산은 비용이 크기도 하고,
기본 할당자(new, malloc)을 사용하시면 환경에 따라 메모리 파편화 문제가 생길 수 있습니다.
즉, 커스텀 할당자를 쓰시면 됩니다. 캐시라인을 고려하시면 더욱 좋습니다.

2 Likes

garbage 메소드들의 경우, garbageCare만 hazardToGarbage 같은 이름으로 바꾸면 괜찮을 것 같습니다.

volatile 문제는 잘 몰랐던 부분입니다. 감사합니다.
저는 volatile 을 레지스터에 있는거 갖다쓰지말고
그 이하의 저장장치에서 가져오라는 키워드로 알고있었습니다.

메모리 new del 은 쓸만한 메모리풀을 만들지 못해서 전부 주석처리했습니다.
계획으로는 지금 queue 를 바탕으로 해제된노드->메모리풀 chunk q->사용q 가 될 것 같습니다.

garbage 메소드 이름도 감사합니다.

좋은 공부를 하게되서 정말 감사합니다.

ps:느려터진 답답한 queue는 아니던가요…? 여러 컴터에서 테스트하진 않아서…

https://developers.google.com/protocol-buffers/docs/reference/arenas

이 글도 한번 읽어보시면 좋습니다.

1 Like

메모리 풀 구현을 나중에 하실거면 그쪽만 인터페이스로 뽑아서 추상화하면 됩니다
그럼 인터페이스만 맞게 구현해주면 끝이니까요