오보에블로그

[C++] std::this_thread 사용법 본문

C++ & C#/C++

[C++] std::this_thread 사용법

(OBO) 2022. 2. 24. 17:32
728x90

C++ this_thread

  • 현재 스레드에 접근할 수 있는 함수 라이브러리

get_id

  • 현재 스레드의 아이디 반환
/*
output :
main thread ID : 37832
t1 thread ID : 18204
func called! thread ID : 18204
*/

#include <thread>
#include <iostream>

using namespace std;

void func()
{
    cout << "func called! " << "thread ID : " << this_thread::get_id() << endl;
}

int main() {

    cout << "main thread ID : " << this_thread::get_id() << endl;
    thread t1(func);
    cout << "t1 thread ID : " << t1.get_id() << endl;

    t1.join();
}

sleep_for

  • 지정 슬립 시간 만큼 현재 스레드의 실행을 멈춘다.
/*
output :
10초 카운트
10
9
8
7
6
5
4
3
2
1
붐!
*/
#include <thread>
#include <iostream>
#include <chrono>         // std::chrono::seconds
using namespace std;

void func()
{
    cout << "10초 카운트" << endl;
    for (int i = 10; 0 < i; i--)
    {
        cout << i << endl;
        this_thread::sleep_for(std::chrono::seconds(1));
    }
    cout << "붐!" << endl;
}

int main() {
    thread t1(func);

    t1.join();
}

yield

  • 현재 스레드 실행을 다시 예약하여, 다른 스레드를 실행할 수 있게함.
  • 비유로, 맨 앞에 사람(현재 스레드)이 다시 뒤로 가는 경우.
/*
output :
func 진입!
not yet .. 
...
not yet .. 
붐..!
*/
#include <thread>
#include <iostream>
#include <chrono>         // std::chrono::seconds
using namespace std;

bool ready = false;

void func()
{
    cout << "func 진입!" << endl;
    while (!ready)
    {
        cout << "not yet .. " << endl;
        this_thread::yield();
    }
    cout << "붐..!" << endl;

}

int main() {

    thread t1(func);

    this_thread::sleep_for(std::chrono::milliseconds(1));

    ready = true;

    t1.join();
}
728x90