簡體   English   中英

如何“中斷”函數調用?

[英]How to “interrupt” a function call?

我正在做一種shell:根據用戶的輸入,我必須調用一些函數。 由於我的程序只是一個客戶端,並且對它們沒有可見性,因此我無法修改那些被稱為函數的內容。

但我希望用戶可以使用CTRL+C呼叫。 這是最少的代碼:

#include <csignal>
#include <iostream>
#include <unistd.h>

void do_thing(void)
{
    std::cout << "entering in do_thing()\n";
    while(42)
        ::sleep(1);
}

extern "C" {
    void signal_handler(int);
}

class Shell
{
    friend void signal_handler(int);

    public:
        static Shell & Instance(void)
        {
            static Shell    instance;
            return instance;
        }
        int run(void)
        {
            std::string     buff;
            while ((std::cin >> buff))
            {
                if (buff == "foo")
                    do_thing(); // this must be terminable
                else
                    std::cout << "(nothing)\n";
            }
            return 0;
        }

    private:
        Shell(void)
        {
            ::signal(SIGINT, signal_handler);
        }
        void signal(int sig)
        {
            if (sig == SIGINT)
                ;// must terminal the function call
        }
};

extern "C" {
    void signal_handler(int sig)
    {
        Shell::Instance().signal(sig);
    }
}

int main(void)
{
    return Shell::Instance().run();
}

我考慮了三種可能性:

  • 我試圖創建一個從std::thread派生的線程類,並帶有一個拋出異常的kill()方法。 該函數調用位於try-catch塊中。 它可以工作,但這是一個糟糕的解決方案,因為無法調用析構函數,並且永遠不會釋放資源。
  • 我考慮過使用fork ,但我認為僅僅獲得中斷函數調用的可能性就太大了。
  • 我試圖從信號處理程序中引發異常,但是我發現這是一個壞主意,因為這是非常依賴於編譯器/ OS的代碼。

你怎么能做這件事? 有什么更好的解決方案?

注意:我刪除了舊帖子,因為它已被關閉,並考慮了C / C ++標記。

本質上,沒有,沒有標准為什么要中斷C ++中的線程。 線程協同運行,因此,它們需要“放棄”控制權。

如果do_thing的代碼是可修改的 ,則可以創建一個標志(原子的)來表示該線程應該放棄並退出。 線程可以定期檢查並按要求完成。

鑒於do_thing的代碼不可修改 ,因此存在一個很小的機會窗口可以用來“殺死”或“取消”線程(盡管它不是“標准”的,並且支持僅限於目標平台)。

std::thread提供了一個檢索實現定義的native_handle()函數。 一旦獲得(並轉換),它就可以用於殺死或取消線程。

被警告 ; 除了所需的特定於平台的代碼外,線程終止通常將對象保留在該線程上的“邊緣”中,並隨它們一起控制它們所控制的資源。

暫無
暫無

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

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