스레드 생성 구버전 방식
#include <windows.h>
#include <iostream>
// 스레드 함수
DWORD WINAPI ThreadFunction(LPVOID lpParam) {
...
}
int main() {
// 스레드에 전달할 매개변수
int threadParam = 42;
// 스레드 생성
HANDLE hThread = CreateThread(
nullptr, // 기본 보안 속성
0, // 기본 스택 크기
ThreadFunction, // 실행할 스레드 함수
&threadParam, // 스레드 함수에 전달할 매개변수
0, // 스레드 실행 옵션 (0이면 즉시 실행)
nullptr // 스레드 ID (필요하지 않음)
);
...
}
스레드 생성 C++11 방식
위의 구버전 방식은 윈도우 환경에서만 가능하기에
리눅스를 비롯한 다양한 환경에서 코드를 활용하기 위해서
C++11부터 도입된 방식을 사용하는 것이 좋다
#include <thread>
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t(HelloThread);
cout << "Hello Main" << endl;
t.join();
}
단일 스레드 vs. 멀티 스레드
#include <thread>
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
// 단일 스레드로 실행
HelloThread();
// 멀티 스레드로 실행
std::thread t(HelloThread);
cout << "Hello Main" << endl;
t.join();
}
핵심 키워드
int32 count = t.hardware_concurrency();// 시스템이 동시에 효율적으로 실행할 수 있는 CPU 코어 개수
auto id = t.get_id();// 스레드 id
t.detach();// 스레드의 연결을 끊는 경우
bool isJoined = t.joinable();// 스레드가 연결된 상태인지 확인
t.join();// 스레드의 연결을 진행
특히, join 키워드는 스레드의 연결을 진행하기 때문에
해당 스레드 작업이 끝날 때까지 종료되지 않도록 한다
스레드 생성 시점
#include <thread>
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t;
auto id1 = t.get_id();// 0
bool isJoined1 = t.joinable();// false
t = std::thread(HelloThread);
auto id2 = t.get_id();// 할당된 id
bool isJoined2 = t.joinable();// true
if (t.joinable())
t.join();
}
위의 코드를 보면
스레드 t의 함수가 들어와야
실제로 id가 생성되고 joinable도 true가 반환된다
참고로, join 키워드를 사용하기 전에
joinable을 사용해서 스레드 생성(연결) 여부를 확인하고 사용하는 것이 추천된다
함수 인자 전달 방법
#include <thread>
void HelloThread(int32 num)
{
cout << num << endl;
}
int main()
{
std::thread t = std::thread(HelloThread, 1);
if (t.joinable())
t.join();
}
vector 활용 예시
#include <thread>
void HelloThread(int32 num)
{
cout << num << endl;
}
int main()
{
vector<std::thread> v;
for (int32 i = 0; i < 10; i++)
{
v.push_back(std::thread(HelloThread, i));
}
for (int32 i = 0; i < 10; i++)
{
if (v[i].joinable())
v[i].join();
}
cout << "Hello Main" << endl;
}
'게임 서버' 카테고리의 다른 글
[게임서버 섹션2 Note] Lock 기초 (0) | 2024.12.28 |
---|---|
[게임서버 섹션2 Note] Atomic (0) | 2024.12.28 |
[게임서버 섹션2 Note] 멀티스레드 개론 (0) | 2024.12.28 |
[게임서버 섹션1 Note] 환경 설정 (0) | 2024.12.28 |
[게임서버 섹션1 Note] 서버 개론 (0) | 2024.12.28 |