gpt4 book ai didi

c++ - C++线程加入后不会中止

转载 作者:行者123 更新时间:2023-12-03 13:16:32 25 4
gpt4 key购买 nike

因此,我的程序中运行着2个线程,最终我希望它们在调用此函数时终止:

void AutoClicker::TerminateThreads()
{
programrunning = false;
clicker.join();
hotkeyLoop.join();
terminateThread = true;
}
然后调用该线程以运行以下代码:
while (1)
{
while (programrunning)
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
}

if (terminateThread) {
std::terminate();
}
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
但是最后一个 if语句似乎没有被调用。它位于我要终止的线程中,因此它应该可以正常工作吗?我对线程还很陌生,所以我真的不知道该怎么做,但这是我在网上找到的:

"When a std::thread object gets destroyed it is not allowed to be joinable(), i.e., one of two things have to happen before it is destroyed:


It was detached and the thread has gone into the wild and there is pretty much no control over whether it has finished or not.


The thread has been join()ed."

最佳答案

首先要考虑的两件事:

  • 不要调用std::terminate()。这不是拆卸程序的好方法,并且可能会使打开的文件和其他OS资源挂起。另外,它适用于整个程序,而不仅仅是调用它的线程。
  • 如果要终止std::thread,则只需从其返回或允许其到达线程函数的末尾即可。

  • 顺便说一句,这是一个小程序,显示了我将如何执行您所描述的操作:
    #include <iostream>
    #include <atomic>
    #include <chrono>
    #include <thread>

    void threadfunc(std::atomic<bool>& running)
    {
    while (running) {
    std::cout << "beep\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    }

    void waitThread(std::atomic<bool>& running)
    {
    std::this_thread::sleep_for(std::chrono::seconds(10));
    running = false;
    }

    int main()
    {
    std::atomic<bool> running = true;

    std::thread t1(threadfunc, std::ref(running));
    std::thread t2(waitThread, std::ref(running));
    t1.join();
    t2.join();
    }
    希望您可以在此处进行一些整理,以使您的程序正常工作。
    编辑:
    从对另一个答案的评论OP中澄清一些内容:
    类似于: std::thread t1(threadfunc, std::ref(running));创建一个 Activity 线程,该线程执行提供的功能。一旦该函数停止(返回),该线程将处于僵尸状态,该线程不执行但仍处于 Activity 状态并保持资源。
    https://en.cppreference.com/w/cpp/thread/thread/joinable

    A thread that has finished executing code, but has not yet been joinedis still considered an active thread of execution and is thereforejoinable.


    为了从该僵尸状态中拉出线程并清理其资源,您必须在其上调用 join()。请注意,您可以在该线程执行完之前或之后在该线程上调用 join()-如果您之前加入,则阻塞直到连接的线程完成为止;如果您加入之后,则将缠结的线程清除干净,然后立即继续。
    或者,您可以在线程上调用 detach():
    https://en.cppreference.com/w/cpp/thread/thread/detach

    Separates the thread of execution from the thread object, allowingexecution to continue independently. Any allocated resources will befreed once the thread exits.


    但是,一旦分离了线程,就不能再加入它,而在仍然有 Activity 但分离的线程仍在运行的情况下退出主线程会以一种微妙的方式杀死分离的线程。因此,只有在您确定分离线程将在主线程之前完成之后,才执行此操作。

    关于c++ - C++线程加入后不会中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66471556/

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