当前位置: 首页 > 知识库问答 >
问题:

创建一个类来存储线程并调用它们

徐景明
2023-03-14
#include <iostream>
#include <vector>
#include <thread>
#include <atomic>

class client {
private:
    std::vector<std::thread> threads;
    std::atomic<bool> running;

    void main() {
        while(running) {
            std::cout << "main" << std::endl;
        }
    }

    void render() {
        while(running) {
            std::cout << "render" << std::endl;
        }
    }
public:
    client() {
        running = true;

        threads.push_back(std::thread(&client::main, this));
        threads.push_back(std::thread(&client::render, this));
    }

    ~client() {
        running = false;
        for(auto& th : threads) th.join();
    };
};

int main() {
    client c;

    std::string inputString;
    getline(std::cin, inputString);

    return 0;
}

共有1个答案

丁嘉
2023-03-14

这里的问题是您没有等待线程结束。在main中创建C。这就产生了线程。接下来要发生的事情是返回破坏C的代码。当C被销毁时,它将销毁其成员。现在,当一个线程被破坏时,如果它还没有被连接或分离,则调用std::terminate,程序结束

您需要做的是在析构函数中,将running设置为false,然后在两个线程上调用join。这将停止每个线程中的循环,并允许正确地析构C

然而,这样做会带来另一个问题。running不是一个原子变量,因此在线程读取时写入它是未定义的行为。但是,我们可以通过将running更改为std::Atomic 来发现这一点,它提供同步

std::thread(&class_name::function_name, pointer_to_instance_of_class_name, function_parameters)
threads.push_back(std::thread(&client::main, this));
threads.push_back(std::thread(&client::render, this));
 类似资料:
  • 之前的警告是因为在 和 execute 中没有对参数做任何操作。让我们用期望的实际行为实现他们。 以考虑 new 作为开始。之前提到使用无符号类型作为 size 参数的类型,因为为负的线程数没有意义。然而,零个线程同样没有意义,不过零是一个完全有效的 u32 值。让我们在返回 ThreadPool 之前检查 size 是否大于零,并使用 assert! 宏在得到零时 panic,如列表 20-13

  • 问题内容: 假设我必须创建一个存储ArrayList的Integers数组,并且数组大小为10。 下面的代码可以做到这一点: 问题1: 我认为更合适的代码是 为什么这不起作用? 问题2: 下面两个都编译 有什么区别尽可能的引用声明和关注? 问题答案: 问题1: 基本上,这是Java语言禁止的。Java语言规范中的泛型部分对此进行了介绍。 使用时 您会收到编译器警告,因为以下示例将进行编译(为每行代

  • 问题内容: 我想合并/合并两个表,并让它创建一个字段来标识它来自哪个表。我看到了SQL的答案,但我不需要最大值。我只需要合并两个表。这是我当前通过访问查询进行的联合查询的SQL。 SELECT [TableA]。[1As],[TableA]。[2As] UNION SELECT [TableB]。[1As],[TableA]。[2As]; 我希望这些表创建whattabl字段,并根据它来自的表来填

  • 每当它试图创建一条线时就会崩溃。我想用PathOverlay,但已经不推荐了。我想画一条线。 梯度控制台 正在执行任务“:app:validateSigningDebug”(最新检查耗时0.0秒),原因是:任务尚未声明任何输出:app:validateSigningDebug(线程[Daemon worker Thread 2,5,main])已完成。花了0.022秒:应用程序:packageDe

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: 我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建一个新线程,并在那里独立于主线程发生的事情做一些事情。这段代码看起来很怪异,但到目前为止,我对线程的了解还很少。你能解释一下这是怎么回事吗? 问题答案: 您正在线程方法中调用该方法。但是只有在线程已经启动时才调用该方法。改为这样做: