[英]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
,但我認為僅僅獲得中斷函數調用的可能性就太大了。 你怎么能做這件事? 有什么更好的解決方案?
注意:我刪除了舊帖子,因為它已被關閉,並考慮了C / C ++標記。
本質上,沒有,沒有標准為什么要中斷C ++中的線程。 線程協同運行,因此,它們需要“放棄”控制權。
如果do_thing
的代碼是可修改的 ,則可以創建一個標志(原子的)來表示該線程應該放棄並退出。 線程可以定期檢查並按要求完成。
鑒於do_thing
的代碼不可修改 ,因此存在一個很小的機會窗口可以用來“殺死”或“取消”線程(盡管它不是“標准”的,並且支持僅限於目標平台)。
std::thread
提供了一個檢索實現定義的native_handle()
函數。 一旦獲得(並轉換),它就可以用於殺死或取消線程。
如果正在使用pthread,請參閱pthread_kill
(或pthread_cancel
如果目標線程支持)。
在Windows上,請參見TerminateThread
函數。
被警告 ; 除了所需的特定於平台的代碼外,線程終止通常將對象保留在該線程上的“邊緣”中,並隨它們一起控制它們所控制的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.