gpt4 book ai didi

C++ 如何在线程终止后删除线程

转载 作者:行者123 更新时间:2023-12-02 18:08:50 24 4
gpt4 key购买 nike

我正在开发一个使用线程连接到服务器的项目。每当按下登录按钮时,它都会初始化一个线程,以使用用户提供的给定 IP 和端口进行登录。

ServerPage.h

class ServerPage {
public:
static std::thread serverThread;

static void login();
}

ServerPage.cpp

#include "ServerPage.h"

std::thread ServerPage::serverThread;

void ServerPage::login() {
while (/*server is not connected*/) {
if (/*button is clicked and thread is not running*/)
serverThread = std::thread(Client::init, ip, port);
}
}

在多次单击该按钮之前,此方法效果很好。我可以使用 Client 类来查看服务器的状态(已连接、未连接或失败) 有没有办法删除或重新初始化,以便它可以运行直到客户端已连接?

最佳答案

首先:线程无法重新启动。编程中没有这样的概念。除非“重新启动”的意思是“杀死并再次生成”。

不可能以跨平台的方式终止线程。对于 posix (我不知道其他操作系统),您可以使用 pthreads (而不是 std::thread )并向其发送终止信号并再次生成它。但这是忍者之道,不一定是你应该做的。例如,如果您杀死当前持有锁的线程,您将陷入死锁。应避免使用此方法。但是,如果您无法修改 Client::init 方法,那么在不削弱您的要求的情况下可能没有其他选择。

更好的解决方案是传递“取消标记”:您可以在其上注册取消处理程序的小对象。然后,每当触发取消时,您都可以实现 Client::init 来取消自身(并进行任何必要的清理,例如释放锁)。点击时触发。

关于C++ 如何在线程终止后删除线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72735235/

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