(C++ : Concurrency-1) std::thread

Posted by : at

Category : Cpp



How to launch a thread (std::thread사용하기)

#include <iostream>
#include <thread>

void func1()
{
	std::cout << "Hello from function \n";
}

class my_class {

public:
	void operator()()
	{
		std::cout << "hello from the class with function call operator \n";
	}
};

int main()
{
    // 1. function으로 thread 생성
	std::thread thread1(func1);

    // 2. class operator로 thread 생성
	my_class mc;
	std::thread thread2(mc);

    // 3. lambda로 thread 생성
	std::thread thread3([] {
		std::cout << "hello from the lambda \n";
		});

	thread1.join();
	thread2.join();
	thread3.join();

	std::cout << "This is main thread \n";
}
hello from the class with function call operator
Hello from function
hello from the lambda
This is main thread

추가) sleep사용하기

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;

int main()
{
    thread::id id = this_thread::get_id();

    cout << id << endl;

    this_thread::sleep_for(3s);
    this_thread::sleep_until(chrono::system_clock::now()+3s);
    this_thread::yield();
}


joinabiligy of threads

#include <iostream>
#include <thread>

void func_1()
{
	std::cout << "hello from method \n";
}

int main()
{
	std::thread thread_1(func_1);   
    // 이 thread의 시작 시점이 궁금할 수 있다
    // 생성과 동시에 바로 시작됨을 기억하자(join이 호출돼야 실행되는게 아님)

	if (thread_1.joinable())
		std::cout << "this is joinable thread \n";

    // 여기서 join시 joinable == false
	//thread_1.join();

	if (thread_1.joinable())
	{
		std::cout << "this is joinable thread \n";
	}
	else
	{
		std::cout << "after calling join, thread_1 is not a joinable thread \n";
	}

	std::cout << "hello from main thread \n";
}

join and detach functions

  • detach
    • 오브젝트와 스레드를 해제한다.
    • detach 함수는 thread 오브젝트에 연결된 스레드를 떼어냅니다.
    • 그래서 detach 이후에는 thread 오브젝트로 스레드를 제어할 수 없습니다
    • 그러나 detach를 호출했다고 해서 관련된 스레드가 종료 되는 것이 아닙니다
    • 즉 thread 오브젝트와 스레드의 연결이 끊어지는 것입니다.
#include <iostream>
#include <thread>
#include <chrono>

void func_1()
{
	std::this_thread::sleep_for(std::chrono::milliseconds(5000));
	std::cout << "hello from func_1 \n";
}


int main()
{
	std::thread thread_1(func_1);
	thread_1.join();        
	// thread_1.detach();   // detach시 func_1()은 불리지 않는다.

	std::cout << "hello from main thread \n";
}
    // ...

    first.detach();
 
    // 스레드 아이디가 초기화 된다.
    std::cout << "after detach first thread id : " << first.get_id() << endl;
            
    // 스레드가 멈출때 까지 대기
    if (true == first.joinable()) // detach후 joinable하지 않으면 에러 발생
        first.join();                
    if (true == second.joinable())
        second.join();  

    // ...

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links