-
강의노트 - 멀티스레드 프로그래밍개발/서버 네트워크 2023. 8. 3. 16:37
DLL 동적 연결 라이브러리
- 실행파일에 포함되지 않아 같이 관리해야 한다
- 정적 라이브러리(lib)
- 실행파일에 포함된다
C, C++ 외부 라이브러리(dll, lib) 사용하기
Import Dynamic or Static Library By Visual Studio 목차 mosquitto나 ifcplusplused 같은 오픈소스를 Build 하기 위해 많은 노력을 했었는데 그 과정에서 얻게 된 지식을 공유하기 위해 작성하였습니다. dll, lib dll과 li
wnsgml972.github.io
쓰레드 생성
#include <thread>
std::thread t1(Function);
C++ Chapter 19.3 : std::thread와 멀티쓰레딩 기초
C++ Chapter 19.3 : std::thread와 멀티쓰레딩 기초
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀 🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
ansohxxn.github.io
씹어먹는 C ++ - <15 - 1. 동시에 실행을 시킨다고? - C++ 쓰레드(thread)>
modoocode.com
Atomic
원자성. 한번에 실행되는 단위. Atomic Add같은 게 있지만 Lock을 쓴다
씹어먹는 C++ - <15 - 3. C++ memory order 와 atomic 객체>
modoocode.com
Lock 기초
- #include <mutex> mutex m; m.lock(), m.unlock();
- std::lock_guardstd::mutex lockguard(m); 소멸될 때 자동으로 unlock된다
- std::unique_lockstd::mutex uniquelock(m, std::defer_lock) 특정 시점으로 lock을 미룰 수 있음
DeadLock
교착 상태
- mutex의 순서를 일정하게 유지할 수 있도록 해야 (cycle이 생기면 안 된다)
- 번호를 매기거나, 순서를 관리하는 별도 클래스를 생성하거나...
- 완전히 막을 방법은 없으니 조심해야 한다
[운영체제] 데드락(Deadlock, 교착 상태)이란?
[운영체제] 데드락(Deadlock, 교착 상태)이란?
컴퓨터/IT/알고리즘 정리 블로그
chanhuiseok.github.io
Lock 구현 이론
이미 다른 곳에서 자원을 사용 중일 때 어떻게 하는가?
- 그냥 기다린다 → SpinLock
- 무작위 시간만큼 기다렸다 다시 온다 → Sleep, Context Switching 발생
- 별도 관리자에게 부탁 → Event
SpinLock
데드락이 해제될 때 까지 그냥 기다리는 방식
Compare And Exchange(CAS)
volatile 키워드: 컴파일러 최적화에서 제외. atomic<bool>을 대신 사용한다
Sleep
일정 시간동안 기다린 뒤 다시 시도(무작위)
Event
이벤트를 이용해 불필요한 대기 방지
커널 오브젝트를 사용하면 다른 프로그램 간 동기화도 가능하다
유저 레벨 밖의 커널까지 개입하므로 추가적인 비용이 필요
Condition Variable
[c++] condition variable(조건 변수)
[c++] condition variable(조건 변수)
이번 글에서는 std::condition_variable에 대해서 설명드립니다. 설명 및 기본 동작 std::condition_variable condition_variable 클래스는 다른 스레드가 공유 변수를 수정하고 condition_variable로 통지할 때까지 스레
jungwoong.tistory.com
[c++] condition variable (조건 변수)
[c++] condition variable (조건 변수)
condition variable (조건 변수)를 사용하면 c++에서 멀티스레드 간 동기화를 구현할 수 있다 그렇지만 condition variable을 사용하는 것보다는, packaged task나 async와 같이 c++에서 제공하는 task를 이용하는
a-researcher.tistory.com
Future
The class template std::future provides a mechanism to access the result of asynchronous operations
비동기 연산의 결과에 접근할 수 있는 방법을 제공하는 template
mutex, condition_variable보다 간단한 연산에 사용하면 유용하다(한 번 발생하는 이벤트 등)
async: 원하는 함수를 비동기 실행
promise: 결과물을 promise를 통해 future로 받아 준다
packaged_task: 원하는 함수의 실행 결과를 future로 받아 준다
씹어먹는 C++ - <15 - 4. C++ future, promise, packaged_task, async>
modoocode.com
메모리 모델(정책)
모든 스레드가 동일한 수정 순서대로 관찰
동일한 값을 관찰하지는 않는다!
코어별로 다른 캐시를 갖기 때문에 생기는 문제
당연히 atomic 연산이 아닌 경우 직접 동기화해야 한다
인텔, AMD의 경우 칩 자체에서 순차적인 일관성을 보장한다
따라서 seq_cst를 사용해도 별도 부하가 없음(ARM은 좀 차이 있음)
씹어먹는 C++ - <15 - 3. C++ memory order 와 atomic 객체>
modoocode.com
1. Sequentially Consistent (seq_cst)
메모리 명령 재배치도 없고, 모든 쓰레드에서 모든 시점에 동일한 값을 관찰할 수 있다
가장 엄격 = 컴파일러 최적화 여지 적음 = 직관적
가시성 문제 해결, 코드 재배치 해결
atomic 객체를 사용할 때, memory_order 를 지정하지 않을 때 기본 값
2. Acquire-Release(acquire, release)
release 명령 이전의 메모리 명령들이, acquire 이후로 재배치되는것을 막는다.
3. Relaxed (relaxed)
자유로움 = 컴파일러 최적화 여지 많음 = 직관적이지 않음
재배치 가능, 가시성 해결 X
기본적인 동일 객체에 대한 동일 순서만 보장
거의 사용하지 않음
Thread Local Storage (TLS)
스레드마다 가지고 있는 로컬 저장소
https://docs.microsoft.com/ko-kr/cpp/parallel/thread-local-storage-tls?view=msvc-160
TLS
자세한 정보: 스레드 로컬 스토리지(TLS)
learn.microsoft.com
스택과의 차이
- 스택은 기본적으로 함수를 위한 메모리 공간(불안정하다)
- TLS는 일반적인 전역 변수 메모리처럼 사용할 수 있다
Lock-Free Stack
Lock이 없다고 꼭 더 좋은 건 아니다. 결국 while 무한루프와 CAS연산을 사용하므로 CPU연산량이 많을 수 있음
비슷한 방식의 shared_ptr로 대체 가능
compare_exchange 연산을 연습하는 데 도움이 된다
CAS연산. 값을 비교하고, 같다면 값을 변경한다(원자성)
Compare And Exchange(CAS) 명령어
Compare And Exchange (CAS)Compare And Exchange (CAE) 명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 비교와 교환을 원자성을 가지고 수행한다. Compare And Swap (CAS) 라는 이름으로도
aerocode.net
락프리는 어지간하면 쓰지 않고, 쓰더라도 MS 라이브러리 사용
'개발 > 서버 네트워크' 카테고리의 다른 글
강의노트 - 네트워크 프로그래밍 (0) 2023.08.03 강의노트 - 메모리 관리 (0) 2023.08.03 5. I/O Completion Ports (IOCP) (0) 2023.08.03 4. OverLapped I/O (0) 2023.08.03 3. 동기, 비동기 통신 (0) 2023.08.03