기록은 기억을 이기고 시간보다 오래 남는다.
반응형

thread 5

Reader-Writer Lock

안녕하세요, 준준입니다. 이번 게시물에서는 **RwLock(Read-Write Lock)**에 대해 알아보겠습니다. RwLock은 읽기와 쓰기의 동시 접근을 관리하기 위한 동기화 메커니즘입니다.여러 스레드가 데이터를 읽을 때는 동시에 접근할 수 있지만,데이터를 쓸 때는 오직 하나의 스레드만이 접근할 수 있도록 하는 기능을 제공합니다.아래의 그림을 보면 이해가 쉬우실까요? 왜 필요한가요? 일반적으로 데이터는 읽기가 빈번하게 일어나고쓰기는 그다지 자주 발생하지 않는 경우가 많습니다. 매번 Lock을 걸어둔다면 쓰기 작업이 거의 없는 상황에서도불필요한 경합(Contension)이 발생할 수 있습니다. RwLock은 이러한 상황에서 효율적으로 동작하여 성능을 향상할 수 있습니다.  RwLock의 주요 특징은 다..

게임 서버 2024.05.29

Lock 이란

만약 하나의 공유 자원에 여러 개의 쓰레드가 접근을 했을 경우그 자원의 값이 뒤죽 박죽이 될 수 있으니 한 쓰레드가 그 자원을 독점 할 수 있도록 도와 준다. Lock 구현 방법으로는 3가지가 있다. 1.Spin lock   - 이 방법은 해당 자원의 임계영역이 풀릴 떄 까지 무작정 기다리는 것을 말한다.   - 무식한 방법이지만 임계영역이 금방 풀릴 것이 기대가 있다면 사용하기 좋다.       하지만 임계영역이 풀리지 않는 다면 매우 비효율적이다.   - 하지만 cpu 점유가 높아 지고 다른 쓰레드를 방해할 수 있다.아래는 Spin lock의 예시이다.#include #include #include std::atomic_flag lock = ATOMIC_FLAG_INIT; // std::atomic_..

[c++] fetch_add() 함수

fetch_add()는 원자적(atomic) 연산 중 하나입니다. C++11에서 추가된 C++ 표준 라이브러리의 std::atomic 클래스의 멤버 함수 중 하나로, 특정 변수에 대한 원자적인 덧셈 연산을 수행합니다. fetch_add()는 특정 변수의 값을 가져온 후에 해당 변수에 인자로 전달된 값을 더하고, 그 결과를 반환합니다.  이 과정에서 해당 변수는 다른 스레드에 의해 변경되지 않는 원자적인 연산이 보장됩니다. 예를 들어, 다음 코드는 x 변수에 대해 fetch_add() 함수를 사용하여 1을 더하는 코드입니다. 위 코드는 x 변수의 값을 1 증가시키고, 그 결과를 result 변수에 저장합니다.fetch_add() 함수는 원자적 연산이므로 다른 스레드가 x 변수를 변경하더라도결과에는 영향을 ..

쓰레드 [thread/THREAD]

쓰레드는 과거에는 표준화가 되어 있지 않았지만현제는 모던 c++에 포함이 되어 있어 #include 헤더를 선언해주면리눅스에서 따로 작업할 필요가 없이 사용가능 하다. thread 객체를 만드는 방법은 아래와 같다.std::tread t; 이 함수들은 C++11에서 제공되는 스레드 클래스의 멤버 함수들이다.hardware_concurrency()함수는 시스템에서 동시에 실행할 수 있는 최대 스레드 수를 반환get_id()스레드 객체의 고유 식별자를 반환detach()스레드 객체를 따로 분리시켜서 실행. 분리된 스레드는 부모 스레드와 독립적으로 실행joinable()함수는 스레드 객체가 join() 함수를 호출할 수 있는지 여부를 반환join()스레드가 종료될 때까지 기다린 후 스레드의 종료를 기다립니다.

세미포어(Semaphore) 활용, 1000보다 큰 값 유지하는 프로그램(c++, Thread)

Semaphore를 활용하여 동기화하며 1000보다 큰 값을 유지하는 프로그램을 만들었습니다. 각 쓰레드의 역할은 Thread 1 = 값을 감소하는 쓰레드 Thread 2 = 값을 증가하는 쓰레드 Thread 3 = 값을 출력 입니다. 아래 사진은 간단한 순서도 입니다. 부족한 점이 많습니다. 많은 조언 부탁드립니다. =========================== #include #include #include #include using namespace std; int g_total = 997; //전역변수 설정 HANDLE hSemaphore[3]; DWORD WINAPI ThreadMinus(LPVOID lpParam) {//g_total의 값을 하나씩 감소시키는 쓰레드 WaitForSingle..

반응형