#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;
}
这里的问题是您没有等待线程结束。在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。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电
问题内容: 我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建一个新线程,并在那里独立于主线程发生的事情做一些事情。这段代码看起来很怪异,但到目前为止,我对线程的了解还很少。你能解释一下这是怎么回事吗? 问题答案: 您正在线程方法中调用该方法。但是只有在线程已经启动时才调用该方法。改为这样做: