gpt4 book ai didi

C++ 杀死一个 std::thread

转载 作者:太空狗 更新时间:2023-10-29 20:19:37 25 4
gpt4 key购买 nike

我有一个程序创建一个线程来监听一个事件。有一种情况是这个线程永远不会收到这个事件,我必须终止它。我知道如何捕捉它不会收到此事件的情况。

我已经创建了一个 std::thread,但是我没有找到关于如何终止线程的任何信息。我试过打电话

t.detach()

然后让析构函数如此工作,但我无法通过这种方式清理线程分配的资源。

我的问题是:1. 有没有办法发送 SIGKILL 或等同于 std::thread 来杀死它?和2. 有没有办法从线程内捕获这个信号来清理资源?

提出(并回答)的问题 How do I terminate a thread in C++11?没有回答我的问题,因为我想从它的父线程而不是从线程内部终止线程。

此外,我的问题是我的工作线程可能正在等待阻塞系统调用(即传入数据包)或条件变量,这就是为什么这很棘手。

最佳答案

  1. Is there a way to send a SIGKILL or equivalent to a std::thread to kill it?

没有这样的等价物;至少是标准的。

  1. Is there a way to catch this signal from within the thread to clean up resources?

C++ 中没有标准的方法来向线程发送信号。

POSIX 有 pthread_kill 可以用来给线程发信号。请注意,“停止”、“继续”或“终止”信号会影响整个过程,因此这与您的确切要求无关。

但是,异步信号处理程序的功能有限,并且无法进行资源清理。你应该做的是让线程知道它应该终止,并让它自动停止和清理。

thread that listens for an event.

解决方案取决于我们正在考虑的聆听类型。如果是条件变量,可以设置一个atomic boolean来请求终止,通过通知唤醒线程。

如果监听是一个阻塞系统调用,解决方案就有点棘手了。发出信号的好处在于它会中断阻塞的系统调用。您可以使用处理程序设置线程可以读取并自动返回的 volatile sig_atomic_t 变量。中断可能让您的线程有机会在恢复等待之前检查变量。需要注意的是,我们必须将可能变成保证:

您必须使用 sigaction(标准 POSIX 函数;非标准 C++)注册信号处理程序,同时取消设置 SA_RESTART。否则,根据系统默认值,系统调用可能会恢复而不是返回。


另一种方法是发送另一个线程正在等待的事件。这可能比上面更简单或更棘手,具体取决于我们正在考虑的事件类型。例如,在监听套接字时,通常可以连接到该套接字。


有一个proposalstd::jthread 线程包装器引入 future 的 C++ 标准,它提供了一种请求线程停止的可移植方式。不幸的是,我不知道关于阻止系统调用会有什么保证。

关于C++ 杀死一个 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57855144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com