Thread Mutex란?
Thread Mutex(Mutual Exclusion, 상호 배제)는 멀티스레드 프로그래밍에서 공유 자원의 동시 접근 문제를 해결하기 위한 동기화 메커니즘입니다.
왜 Mutex가 필요한가?
멀티스레드 환경에서는 여러 스레드가 동시에 실행되며, 공유 자원(예: 메모리, 파일, 데이터베이스 등)에 접근하는 경우 데이터가 손상될 수 있습니다. 이를 **Race Condition(경쟁 상태)**라고 합니다.
Mutex는 공유 자원에 대한 접근을 하나의 스레드로 제한하여 이러한 문제를 방지합니다.
Mutex의 작동 방식
- 잠금(Lock):
- 스레드가 공유 자원에 접근하기 전에 Mutex를 잠급니다.
- 다른 스레드들은 Mutex가 해제될 때까지 대기해야 합니다.
- 해제(Unlock):
- 작업이 완료되면 Mutex를 해제합니다.
- 대기 중인 다른 스레드 중 하나가 Mutex를 얻고 공유 자원에 접근할 수 있습니다.
Mutex의 주요 특징
- 상호 배제(Mutual Exclusion): 한 번에 하나의 스레드만 공유 자원에 접근할 수 있습니다.
- Thread-safe: 공유 자원을 안전하게 보호할 수 있습니다.
- Deadlock 위험: 올바르게 사용하지 않으면 여러 스레드가 무기한 대기 상태에 빠질 수 있습니다.
Mutex의 간단한 예제 (C++)
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // Mutex 객체 생성
int shared_data = 0;
void thread_function(int id) {
mtx.lock(); // Mutex 잠금
std::cout << "Thread " << id << " is accessing the shared data.\n";
shared_data += 1;
std::cout << "Shared data: " << shared_data << "\n";
mtx.unlock(); // Mutex 해제
}
int main() {
std::thread t1(thread_function, 1);
std::thread t2(thread_function, 2);
t1.join();
t2.join();
return 0;
}
결과:
Thread 1 is accessing the shared data.
Shared data: 1
Thread 2 is accessing the shared data.
Shared data: 2
Mutex의 장점
- 데이터 보호: Race Condition 방지.
- Thread-safe: 멀티스레드 프로그램에서 안정성 보장.
Mutex의 단점
- Deadlock: 스레드가 서로의 Mutex를 기다리다가 교착 상태에 빠질 수 있습니다.
- 성능 저하: 스레드가 Mutex를 기다리며 대기하는 동안 자원을 낭비할 수 있습니다.
Mutex와 관련된 개념
- Recursive Mutex:
- 같은 스레드에서 여러 번 잠글 수 있는 Mutex.
- 반드시 잠근 횟수만큼 해제해야 함.
- Spinlock:
- 스레드가 Mutex를 얻을 때까지 반복적으로 확인하며 기다림.
- 간단하지만 CPU 자원을 더 많이 소비.
- Deadlock 방지 방법:
- 항상 Mutex를 얻는 순서를 일정하게 유지.
- try_lock()과 같은 함수를 사용하여 대기 시간을 제한.
결론
Thread Mutex는 멀티스레드 환경에서 공유 자원을 안전하게 관리하기 위한 중요한 도구입니다. 올바른 설계와 사용법으로 Mutex를 활용하면 프로그램의 안정성과 데이터 일관성을 보장할 수 있습니다.
밥(메모리) 먹을려면 차례대로 기다려야 이넘들아st ㅋㅋㅋㅋㅋㅋㅋ
공유자원은 늘 소중하지...!
flow 보러가보자
살펴보면 CreateMutex함수로 Mutex를 생성하는 것을 볼 수 있는데 어떻게 구성되어 있는지 살펴보면 아래와 같다.
HANDLE CreateMutexA(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCSTR lpName );
IpMutexAttributes 매개변수는 SECURITY_ATTRIBUTES구조에 대한 포인터이고
이 매개변수 값이 NULL이면 자식 프로세스가 핸들을 상속할 수 없다.
bIntialOwner 매개변수는 이 값이 TRUE(1)이고 호출자가 Mutex를 만든 경우
호출 스레드는 Mutex 개체의 초기 소유권을 얻는다.
즉 Mutex를 생성한 스레드가 첫 번째 소유권을 가지는지 여부를 판단한다.
IpName 매개변수는 Mutex 개체의 이름을 지정한다.
이름의 길이는 MAX_PATH characters 만큼 제한되고 이름 비교는 대소문자를 구분한다.
이미 사용하고 있는 이름으로 호출하면 MUTEX_ALL_ACCESS 액세스 권한을 요청한다.
이 경우 bInitialOwner 매개변수는 생성 프로세스에서 이미 설정되었기 때문에 무시한다.
CreateMutex함수에 대하여 공부를 하였으니 다시 위로 돌아가서 분석을 해보면 중간에서
CreateThread함수를 호출하고 난 뒤 CreateMutex함수를 호출하는 것을 볼 수 있었고
이 구간이 Thread Mutex임을 확인할 수 있다.
Thread Mutex가 무엇인지 구하는 문제였으므로
답은 CreateMutex함수의 IpName 매개변수의 값인 smtp_bagla_1000임을 확인할 수 있다.
출처:https://surw.tistory.com/35
[화이팅:티스토리]
캬 ㅋㅋㅋㅋ설명 너무 완벽하고...멋있다 멋있어...
Thread Mutex 구하는거니까, createthread함수 호출하고 createmutex 함수 호출했으니
그 사이에있는매개변수의 값이 정답이 되는거다..!
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[114] IT 비전공자 [dreamhack]likeb64문제 풀기 (0) | 2025.01.02 |
---|---|
[113] IT 비전공자 [dreamhack]Check Return Value문제 풀기 (3) | 2025.01.01 |
[111] IT 비전공자 [dreamhack]Easy Assembly문제 풀기 (0) | 2024.12.30 |
[110] IT 비전공자 [dreamhack]Check Function Argument문제 풀기 (0) | 2024.12.29 |
[109] IT 비전공자 [dreamhack]mmapped문제 풀기 (1) | 2024.12.28 |