Updated:

1 minute read

개요

  • thread와 일반적으로는 동일
  • destruction 시 자동으로 다시 join
  • 특정 상황에서 중지 가능
  • 공유 중지 상태를 유지하는 stop_source 타입의 private 멤버를 내부적으로 가짐
    • 생성자는 stop_token을 첫 번째 인수로 사용하는 함수를 허용
    • 함수는 실행 중에 중지가 요청되었는지 확인하고 요청된 경우 반환 가능
  • 멤버 함수
    • stop token handling
      • get_stop_source()
        • 스레드의 공유 중지 상태와 관련된 stop_source 객체를 반환
      • get_stop_token()
        • 스레드의 공유 중지 상태와 관련된 stop_token을 반환
      • request_stop()
        • 스레드의 공유 중지 상태를 통해 실행 중지를 요청
        • destruction 시 request_stop()를 호출하고 이미 호출 했다면 무시


예제

  • 코드
     #include <chrono>
     #include <iostream>
     #include <thread>
        
     using namespace std;
        
     int main() {
     	auto test1 = []() {
     		// automatically rejoins on destruction
     		jthread([]() { cout << "1" << endl; });
     	};
     	test1();
        
     	cout << endl << "------" << endl << endl;
        
     	auto test2 = []() {
     		jthread t([](stop_token token) {
     			cout << "1" << endl;
        
     			using namespace chrono_literals;
     			this_thread::sleep_for(1s);
        
     			if (token.stop_requested()) {
     				cout << "stop" << endl;
     				return;
     			}
        
     			cout << 2 << endl;
     		});
        
     		cout << 3 << endl;
        
     		t.join();
     	};
     	test2();
        
     	cout << endl << "------" << endl << endl;
        
     	auto test3 = []() {
     		jthread t([](stop_token token) {
     			cout << "1" << endl;
     			using namespace chrono_literals;
     			this_thread::sleep_for(1s);
        
     			if (token.stop_requested()) {
     				cout << "stop" << endl;
     				return;
     			}
        
     			cout << 2 << endl;
     		});
        
     		t.request_stop();
     		t.join();
        
     		cout << 3 << endl;
     	};
     	test3();
        
     	return 0;
     }
    
  • 실행 결과
     1
        
     ------
        
     3
     1
     2
        
     ------
        
     1
     stop
     3