server14 Chapter 1 - 멀티쓰레드 프로그래밍 (7) Reader-Writer Lock /*---------------- RW SpinLock -----------------*/ /*-------------------------------------------- [WWWWWWWW][WWWWWWWW][RRRRRRRR][RRRRRRRR] W : WriteFlag (Exclusive Lock Owner ThreadId) R : ReadFlag (Shared Lock Count) ---------------------------------------------*/ // W -> R (O) // R -> W (x) class Lock { enum : uint32 { ACQUIRE_TIMEOUT_TICK = 10000, MAX_SPIN_COUNT = 5000, WRI.. 2023. 3. 29. Chapter 1 - 멀티쓰레드 프로그래밍 (6) Lock-Free Queue (참고만) template class LockFreeQueue { struct Node; struct CountedNodePtr { int32 externalCount; // 참조권 Node* ptr = nullptr; }; struct NodeCounter { uint32 internalCount : 30; // 참조권 반환 관련, 비트를 30과 2로 쪼개어서 사용 uint32 externalCountRemaining : 2; // Push, Pop 다중 참조권 관련 }; struct Node { Node() { NodeCounter newCount; newCount.internalCount = 0; newCount.externalCountRemaining = 2; coun.. 2023. 3. 29. Chapter 1 - 멀티쓰레드 프로그래밍 (5) Thread Local Storage 쓰레드마다 개별적으로 가지고있는 Stack 저장공간이 존재 그러나 정적 변수, 전역 변수 등은 모든 쓰레드가 공유 따라서 각 쓰레드에서 필요한 데이터들을 모두 TLS로 옮겨온 후에 사용 TLS(Thread Local Storage) : 쓰레드별로 가질 수 있는 고유한 저장공간 스택은 불안정한 메모리, TLS는 자신만의 독립적인 전역 메모리 C++11에서 TLS를 사용하는 표준이 정의됨 #include thread_local int32 LThreadid = 0; void ThreadMain(int32 threadid) { LThreadid = threadid; while (true) { cout next = _head 가 자동으로 이루어짐 } // while문 통과시 .. 2023. 3. 29. Chapter 1 - 멀티쓰레드 프로그래밍 (4) 캐시 데이터 전송 비용 >> CPU 연산 비용 따라서 임시 메모리인 캐시를 활용함 레지스터 / L1 캐시 / L2 캐시 / ... 어떠한 데이터를 RAM에서 꺼내와 임시적으로 캐시에 저장 동일하거나 인접한 데이터를 우선 캐시 메모리에서 체크한 후 사용 캐시는 Temporal Locality(시간적 지역성)과 Spatial Locality(공간적 지역성) 특성을 가지고있음 #include int32 buffer[10000][10000]; int main() { memset(buffer, 0, sizeof(buffer)); { uint64 start = GetTickCount64(); int64 sum = 0; for (int32 i = 0; i < 10000; i++) for (int32 j = 0; j .. 2023. 3. 29. 이전 1 2 3 4 다음