簡體   English   中英

C ++終止線程

[英]C++ terminate thread

我知道這個問題已經被問過很多次,並且我知道結束線程的最好方法是使用標志並在請求時退出線程功能。 這也是我目前正在做的事情,但是我的問題是線程函數運行了很長時間,因此有時我需要等待幾個小時直到線程結束。 我的線程函數看起來像這樣:

void threadfunction()
{
    while(!exitRequested)
    {
        doSomeWork();
        object1.doSomeWork();
        object2.doSomeWork();
        while(somecondition)
        {
            object3.doSomeWork();
        }
        object4.doSomeWork();
    }
}

這只是一個示例,實際上代碼看起來要復雜得多。 但是我想證明的是,我調用了幾個類方法,這些方法可能需要幾個小時才能完成(每個函數)。

所以我在做什么,此刻是檢查是否已請求退出是在功能之間(例如之間object1.doSomeWork();object2.doSomeWork(); ),但正如我所說的函數調用可能需要長達幾個小時,所以我需要檢查在這些函數中是否要求退出。 為了做到這一點,我需要將exitRequested標志傳遞給這些函數,但是我認為這看起來不太好,為此可能會有更好的解決方案。

我可以想到的一種解決方案是拋出異常,以創建如下內容:

void threadfunction()
{
    try {
        while(!exitRequested)
        {
            ...
        }
    } catch (const ExitRequestException &e) {}
}

但是隨后需要以某種方式提出例外。 據我所知,我無法在另一個線程的線程中引發異常,對嗎?

您有更好的解決方案嗎? 還是您認為我真的需要將exitRequested標志傳遞給所有這些函數並污染我的代碼?

谷歌搜索了一段時間后,我發現(創建)了一個對我來說很好的答案,盡管它僅適用於pthreads。 對於非pthread,我可以想象使用這里描述的概念。

所以我現在在做什么:我正在向工作線程發送信號。 該線程在信號處理程序中處理自定義信號,並引發異常。 該異常在線程函數的外部發生。 通過使用這種概念,我的優勢是拋出了異常並且堆棧未展開,因此我可以關閉所有打開的資源。 這是我完整的工作示例:

#include <thread>
#include <signal.h>
#include <unistd.h>
#include <iostream>

using namespace std;

//Custom exception which is used to stop the thread
class StopException {};

void sig_fun(int s)
{
    if(s == SIGUSR2)throw StopException();
}

void threadFunction()
{
    cout<<"Thread started"<<endl;
    try {
        while(true)
        {
            //Work forever...
            sleep(1);
        }
    } catch(const StopException &e) {
        cout<<"Thread interrupted"<<endl;
    }
    cout<<"Thread stopped"<<endl;
}

int main(int argc, char *args[])
{
    //Install Signal handler function
    signal(SIGUSR2, sig_fun);
    pthread_t threadObject;
    thread t([&threadObject]()
    {
        //Store pthread_t object to be able to use it later
        threadObject = pthread_self();
        threadFunction();
    });

    string temp;
    cout<<"Write something when you want the thread to be killed"<<endl;
    cin>>temp;

    //Send Signal to thread
    pthread_kill(threadObject, SIGUSR2);
    t.join();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM