어떻게 C++에서 스레드를 종료합니까?

어떻게 C++에서 스레드를 종료합니까?

2022-06-04 last update

5 minutes reading C++
그러면 다음 이유로 스레드 실행 중에 스레드를 종료해서는 안 됩니다.
  • 한 라인이 파일을 열어서 썼을 수도 있습니다. 이 라인이 종료되면 이 파일은 닫히지 않습니다.이것은 번거롭다.
  • 한 라인은 단독으로 사용할 수 있도록 컴퓨터 자원의 자물쇠를 얻었을 수도 있다.스레드가 종료되면 자원은 잠겨 있고 다른 스레드와 프로세스는 자원을 사용할 수 없습니다.
  • 할당된 메모리를 방출해야 합니다.스레드가 일부 목적을 위해 메모리를 분배했을 수도 있습니다.스레드가 종료되면 메모리는 오류 분배를 유지하고 다른 스레드와 프로세스에 사용할 수 없습니다.메모리 유출입니다.
  • 이러한 원인과 그 어떠한 의미도 한 라인이 종료되면, 다른 라인과 프로세스에 사용할 수 있는 자원이 방출되지 않을 것이다.하나의 라인이 자연적으로 완성될 때, 얻은 자원은 모두 방출될 것이다.
    라인을 종료하는 전형적인 동기는 사용자가 더 이상 라인을 필요로 하지 않는 결과이다.
    좋은 소식이 있습니다. C++20은 현재 C++의 최신 버전입니다.C++20의 스레드 클래스에는 일부 구성 요소가 있습니다. 스레드가 자연적으로 끝나기 전에 스레드의 자원을 방출하고 스레드가 자연적으로 끝나기 전에 스레드를 멈출 수 있습니다.이렇게 하면 C++는 라인을 종료하는 것이 아니라 정지합니다.다시 말하면 C++20은 책임감 있게 라인을 종료하고 있다.자원의 방출과 라인의 정지는 자동이다.주의: 모든 스레드가 이런 방식으로 멈출 수 있는 것은 아닙니다.설령 그것을 막으려고 하더라도, 이런 노선은 자연적으로 완성될 것이다.
    루틴 라이브러리에는 자원을 방출할 때 멈추는 클래스가 있습니다: stop\u token,stop\u source,stop\u callback.각 클래스는 객체를 인스턴스화할 수 있습니다.단, 이 강좌는stop\u 표기와stop\u 원본만 고려합니다.
    C+20의 경우 g++ 컴파일러를 사용하여 루틴 프로그램을 실행하는 명령은 다음과 유사해야 합니다.
    g++ -std=c++2a temp.cpp -lpthread -o temp
    이 강좌는 자원을 방출하는 상황에서 어떻게 라인을 멈추는지 소개한다.자원을 방출하는 상황에서 라인을 정지하는 것은 라인을 중지하는 책임감 있는 방식이다.이 강좌는 라인 작성의 요약부터 시작합니다.

    문장 내용







  • 스레드 인코딩 요약


    C++에서 실행되는 프로그램은 프로세스입니다.루틴은 프로세스의 하위 프로세스입니다.간단한 C++ 프로그램은main () 함수인 라인만 있습니다.main () 함수는 정식으로 선언된 루틴이 아닙니다.같은 프로그램의 다른 라인은 반드시 정식으로 성명해야 한다.한 프로그램에 여러 개의 라인이 있을 수 있다.
    스레드는 스레드 라이브러리의 스레드 클래스에서 실례화된 것이다.루틴 대상이 설명하는 첫 번째 매개 변수는 최고급 함수의 이름입니다.최상위 함수는 유효한 라인이다.대상이 실례화되면 최고급 함수가 실행(실행)됩니다.
    호출된 라인과 호출된 라인이 있습니다.불행하게도, 호출된 루틴이 호출된 루틴의 함수체에서 추가되지 않으면, 호출된 루틴은 호출된 루틴이 자신의 실행을 완성하지 않은 상태에서 실행될 수 있습니다.이것은 번거롭다는 것을 의미한다.따라서 호출된 루틴의 함수체는 호출된 루틴이 실례화된 후에 호출된 루틴을 넣어야 한다.
    다음 프로그램에서 최상위 함수 fn() 실례화 스레드 객체를 사용합니다.
    #include 
    
    #include 
    
    using namespace std;
    
    
    void fn() {
    
    cout <
    출력:
    first code segment of thread
    
    second code segment of thread
    스레드 라이브러리가 포함되어 있음을 주의하십시오.main 함수의 첫 번째 문장과 두 번째 문장이 어떻게 인코딩되었는지 주의하십시오.main () 함수는 주 루틴입니다.fn () 은 최상위 함수입니다.

    jthread 클래스


    jthread는 온라인 라이브러리에 정의된 클래스입니다.그것은thread류와 유사하지만, 자원을 방출함으로써 라인을 멈출 수 있다는 장점이 있다.이것은 stop\u 영패 대상과 stop\u 원본 대상을 되돌려주는 구성원 함수를 가지고 있습니다.구성원 기능은 다음과 같습니다.
    stop_source get_stop_source()
    
    stop_token get_stop_token()
    또한 다음과 같은 중지 요청을 보내는 구성원 기능도 있습니다.
    bool request_stop()
    지금까지 2021 10월까지 많은 C++ 컴파일러들이 jthread 클래스를 실현하고 있다.그러나 컴파일러가 jthread 클래스를 실현했을 때 아래에 제시된 코드 예시가 작동할 수 있을 것입니다.

    스레드 중지 요청


    정지선은 최고급 함수의 운행을 정지하는 것을 의미한다.요청을 멈추는 것은 라인이 가능한 한 빨리 멈춰야 한다는 것을 의미한다.요청이 부여되지 않으면, 라인은 끝날 때까지 실행되며, 끝날 때까지 멈추지 않습니다.
    위에서 말한 바와 같이, jthread에서 실례화된 스레드는 책임지게 스레드를 종료하고 (스레드가 자원을 방출하는 것을 막는) 특성을 가지고 있다.이 중지를 요청하는 구성원 함수는 다음과 같습니다.
    bool request_stop()
    요청이 받아들여지면 반환값은true이고, 그렇지 않으면 반환값은false입니다.요청을 받아들이는 것은 라인이 가능한 한 빨리 멈출 것이라고 보장하지 않는다.이 요청을 실행할 수 없을 수도 있습니다. 라인은 자연이 끝날 때까지 멈추지 않습니다.즉, true로 돌아가는 것은 멈출 수 있다는 것을 의미하지 않는다.다음 프로그램은 jthread 객체의 이 구성원 함수 사용을 설명합니다.
    #include 
    
    #include 
    
    using namespace std;
    
    
    void fn() {
    
    cout <
    이 프로그램은 상기 프로그램과 유사하지만 두 가지가 있습니다.
  • 스레드thr는 jthread류에서 실례화된 것이다.
  • 라인을 빨리 멈추는 문장 (request) 은join () 문장 앞에 놓습니다.이런 상황에서 호출 루트는 호출된 루트가 계속 실행되는 것을 막을 것이다.
  • 중지할 수 있습니까?


    어떤 경우, 라인을 멈출 수 없습니다.그러나 프로그래머는 라인이 멈출 수 있는지 알 수 없습니다.이런 상황에서 프로그래머는 반드시 조회를 해야 한다.stop\u 소스에는 구성원 함수가 있습니다.
    bool stop_possible() const
    반환값이true라면, 라인이 자연적으로 끝나기 전에 라인을 멈출 수 있습니다.되돌아오는 값이false라면, 라인이 자연적으로 끝날 때까지 라인을 멈출 수 없습니다.jthread는 stop\u 소스 객체를 반환하는 방법이 있습니다.
    따라서 라인을 멈추기 전에 라인을 멈출 수 있는지 물어보는 것이 좋다.다음 절차에 대해 설명합니다.
    #include 
    
    #include 
    
    using namespace std;
    
    
    void fn() {
    
    cout <
    정지 코드 세그먼트는join 문장 앞에 놓여 있습니다.

    중지 요청이 전송되었습니까?


    라인을 멈출 수 있다면, 이것은 request\ustop () 문장이 라인이 자연적으로 끝나기 전에 성공적으로 라인을 멈출 수 있음을 보장할 수 없습니다.만약 스레드가 예상대로 자연이 끝날 때까지 멈추지 않았다면, 프로그래머는 request\ustop () 문장을 사용해서 스레드를 멈추라고 요구했는지 알고 싶을 것입니다.
    stop_영패 대상은 구성원 함수,
    bool stop_requested()
    정지 요청을 보내면 이 함수는true를 되돌려줍니다. 그렇지 않으면false를 되돌려줍니다.jthread 대상은stop\u영패 대상과 그 구성원 함수를 되돌려줍니다.
    stop_token get_stop_token() const
    다음 main () 함수 코드는 request\u stop을 보냈는지 확인하는 방법에 대해 설명합니다.
    int main()
    
    {
    
    jthread thr(fn);
    
    stop_source ss = thr.get_stop_source();
    
    if (ss.stop_possible())
    
    thr.request_stop();
    
    else
    
    cout <
    모든 정지 코드는join 문장 앞에 있습니다.request\ustop () 과 stop\u requested () 함수를 혼동하지 마십시오.

    결론


    C++20 이상의 버전을 사용하면 라인을 안정적으로 종료할 수 있습니다.이것은 방출된 스레드 자원을 사용하여 스레드를 멈추는 것을 의미한다.스레드 라이브러리는stop\u 태그,stop\u 원본,stop\u 리셋 및 jthread 클래스를 가지고 있으며, 책임지고 스레드를 종료하는 데 사용됩니다.stop\u 태그,stop\u 원본,stop\u 리셋 실례화 대상을 사용하려면 jthread 클래스를 사용하여 라인을 만듭니다.jthread 클래스는 라인 라이브러리에 있습니다. C++ 프로그램에 포함되어야 합니다.
    jthread 클래스는stop\u 태그와stop\u 원본 대상을 되돌려주는 구성원 함수를 가지고 있습니다.jthread 클래스 자체에 구성원 함수request\ustop () 이 있습니다. 라인을 정지하는 데 사용됩니다.이 요청은 비준될 수 있지만, 비준될 것이라고 보장할 수는 없다.만약 요청이 비준된다면, 라인은 가능한 한 빨리 멈추고, 자연의 종점에 도달하지 않을 것이며, 모든 것은 평등할 것이다.
    stop\u 소스 객체는 스레드를 중지할 수 있는지 확인하는 데 사용됩니다.stop\u token 객체는 request\u stop () 을 보냈는지 확인하는 데 사용됩니다.일단 정지 요청을 하면 철회할 수 없습니다. (후속 정지 요청은 무효입니다.)