본문 바로가기

멀티쓰레드프로그래밍9

Lock-Free-Stack.(스마트포인터를 사용하지 않은 버전) Lock-Free-Stack? 락이 없는 스택, queue등을 락프리 프로그램이라고하는데 딱히 성능이 더 좋다고나 그렇지 않다고한다.. 그리고 멀티스레드환경에서 동기화를 맞춰주기 위해서 할 것들이 많기에 복잡하다.. version1. (스마트포인터를 사용하지 않은 버전).! Push 함수 부분.. void Push(const T& value) { Node* newNode = new Node(value); //이부분부터 멀티스레딩 환경에서는 문제가 된다.. ! newNode->next = _head; /*if (_head == newNode->next) { _head = node; return true; } else { node->next = _head; return false; }*/ // 수백개의 스레.. 2022. 5. 25.
deadlock_profiler deadlock_profiler 데드락을 미리 잡기 위해서 deadlock_profiler를 살펴보자. 일반적으로 데드락은 nullptr이 0순위이다. 빈번하게 발생하는 데드락. 왜? 데드락은 타이밍 이슈라서 찰나가 너무 짧기때문에 개발단계에서는 안 잡히지만 라이브 단계에서는 잡힐 확률이 많아서 미리 예방을 해야한다. 그렇게 하기위해서 그래프 알고리즘을 이용해서 사이클을 판별하면된다. 그래프가 탐색이 완료되기전에 역방향으로 오는 간선을 발견했다면 그것은 교차 간선이 아니라, 역방향 간선이다. DeadLockProfiler.h #pragma once #include #include #include class DeadLockProfiler { public: void PushLock(const char* na.. 2022. 4. 17.
SpinLock, Sleep, Event SpinLock SpinLockd은 lock이 있을 경우 자기 자리로 다시 돌아가는 것이 아닌 주위에서 계속해서 빙글빙글 돌아다닌 것을 의미한다. spinlock 소스 #include "pch.h" #include #include #include #include using namespace std; class SpinLock { public: void lock() { //CAS(Compare-And-Swap) bool expected = false; // 락을 걸기를 원하는 대상의 현재상태 그러나 현재는 false이다 bool desired = true; // 락이 걸리기를 기대하는 것 ////CAS 의사코드 //if (expected == _locked) //{ // expected = _locked;.. 2022. 4. 7.
Future 동기실행의 문제점? 우선 Future를 보기 전에 동기 실행의 문제점을 살펴보자... int64 Calculate() { int64 sum = 0; for (int32 i = 0; i Calculate가 끝날때까지 기다려야하는 것이다. 기다리면 안되나? -> main에서 다른 것들도 처리할 것이 많은데 계속해서 Calculate를 기다리게된다면 문제가 많다.. std::future를 사용하자 std::future에는 비동기를 하거나 지연을 시키는 법이 존재한다. 참고로 비동기랑 멀티스레드랑 다르다 deferred는 .. 2022. 4. 7.