"https://en.cppreference.com/w/cpp/thread"
#include <Windows.h>
DWORD WINAPI PrintMessage()
{
}
int main()
{
DWORD myThreadID;
HANDLE myHandle = CreateThread(0,0,PrintMessage,NULL,0,&myThreadID);
WaitForSingleObject(myHandle, INFINITE);
CloseHandle(myHandle)
return 0;
}
#include <pthread.h>
void* printMessage()
{
}
int main()
{
pthread_t thread = 0;
int result_code = pthread_create(&thread, NULL, printMessage, NULL);
result_code = pthread_join(thread, NULL):
return 0;
}
표준 C++ 쓰레드
이동(move) 가능
복사 불가능
다른 쓰레드 추가하고 싶으면 새로 만들어야 함.
EX) 쓰레드 개체 만들기
#include <thread>
void PrintMessage(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "message from a child thread.");
PrintMessage("Message from a main thread");
}
// 좋은 예가 아님...
- thread() noexcept;
template<class Function, class... Args>
explicit thread(Function&& f, Args&&... args);
- std::thread emptyThread;
- std::thread printThread(PrintMessage, 10);
thread(thread&& other) noexcept;// 이동 생성자, 이동 가능
thread(const thread&) = delete;// delete 처리된 복사 생성자. 복사 불가능.
std::thread printThread(PrintMessage, 10);
std::thread movedThread(std::move(printThread));// OK, printThread는 더 이상 쓰레드가 아님
std::thread copiedThread = movedThread;// 컴파일 에러
#include <thread>
void PrintMessage(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "message from a child thread.");
PrintMessage("Message from a main thread");
}
//출력
//Message from a child thread.Message from a main thread.
위 코드의 문제점
std::thread::join()
Ex) 자식 쓰레드가 끝날 때까지 기다리기
#include <thread>
void PrintMessage(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "message from a child thread.");
PrintMessage("Message from a main thread");
thread.join(); <-- 기다림...
}
#include <thread>
void PrintMessage(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "message from a child thread.");
// "id 타입이 운영체제마다 다르다. int 일 수도 있고 다른 타입일 수 도 있다."
std::thread::id childThreadID = thread.get_id();
std::stringstream ss;
ss << childThreadID;
std::string childThreadIDStr = ss.str();
PrintMessage("Message from a main thread");
thread.join();// 기다림...
}
#include <thread>
void PrintMessage(const std::string& message, int count)
{
for(int i = 0; i < count; ++i)
}
int main()
{
std::thread thread(PrintMessage, "message from a child thread.", 10);
PrintMessage("Message from a main thread", 1);
thread.detach();// 떼어냄
// 종료 될 때 thread를 소멸 시켜도 안전하게 프로그램 제거 할 수 있음, 왜냐하면 이전에 thread를 때어냈으니까...
// Main 쓰레드가 종료 되더라도 새로 만든 쓰레드는 계속 달리게끔 한다.
}
// 출력
// 1: 1: Message from a child thread.Waiting the child thread...
thread.detach(); <-- 떼어냄
thread.join(); <-- !!! 불가능 ...
if(thread.joinable())
{
thread.join();
}
#include <thread>
int main()
{
auto printMessage = [](const std::string& message)
{
std::cout << message << std::endl;
}
std::thread thread( printMessage, "message from a child thread.");
PrintMessage("Message from a main thread");
thread.join();
}
#include <thread>
int main()
{
std::vector<int> list(100, 1);
int result = 0;
std::thread thread(
[](const std::vector<int>& v, int& result)
{
for(auto item : v)
{
result += item;
}
},
list, std::ref(result)) <-- 인자
);
thread.join();
std::cout << "Result: " << result << std::endl;
}
네입스페이스 그룹
현재 쓰레드에 적용되는 "도우미 함수"들이 있음
Ex) 쓰레드 실행 잠시 멈추기
void PrintCurrentTime(){/*현재 시간 출력*/}
void PrintMessage(const std::string& message)
{
std::cout << "Sleep now...";
PrintCurrentTime();
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << message << " ";
PrintCurrentTime();
}
int main()
{
std::thread thread(PrintMessage, "Message from a child thread.");
PrintMessage("Message from a main Thread.");
thread.joing();
return 0;
}
void PrintMessage(const std::string& message, std::chrono::seconds delay)
{
auto end = std::chrono::high_resolution_clock::now() + delay;
while(std::chrono::high_resolution_clock::now() < end)
{
std::this_thread::yield();
}
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "Message from a child thread.", std::chrono::seconds(3));
PrintMessage("Message from a main thread", std""chrono::seconds(2));
thread.join();
}