关于std::thread类的问题
Questions about std::thread class
考虑以下类标题:
class ThreadClass {
public:
ThreadClass();
~ThreadClass();
void operator()(int val);
void set(int val);
int get();
private:
int x;
};
以及以下实现:
ThreadClass::ThreadClass(): x(0) {
std::cout << "Constructing..." << std::endl;
}
ThreadClass::~ThreadClass() {
std::cout << "Destructing..." << std::endl;
}
void ThreadClass::operator()(int val) {
set(val);
std::cout << get() << std::endl;
set(val * 2);
std::cout << get() << std::endl;
}
void ThreadClass::set(int val) {
x = val;
}
int ThreadClass::get() {
return x;
}
启动以下main
时,类析构函数会被调用多次而不是一次:
int main(int argc, char const *argv[]) {
std::thread x = std::thread(ThreadClass(), 10);
x.join();
return 0;
}
>>> Constructing...
>>> Destructing...
>>> Destructing...
>>> 10
>>> 20
>>> Destructing...
由于我对std::thread
类的了解不太深入,我想问你:
- 为什么会发生这种情况?真诚地说,我期待的只是
ThreadClass
的一个实例 - 为了避免意外行为,是否有必要重载某些类运算符
您正在调用尚未定义(尚未为您创建)的隐式构造函数。你可以在这里看到他们的行动:
#include <thread>
#include <iostream>
class ThreadClass {
public:
ThreadClass() {
std::cout << "Constructing..." << std::endl;
}
ThreadClass(const ThreadClass& t) {
std::cout << "Copy constructing..." << std::endl;
this->x = t.x;
}
// ThreadClass(ThreadClass&& t) {
// std::cout << "Move constructing..." << std::endl;
// this->x = t.x;
// }
~ThreadClass() {
std::cout << "Destructing..." << std::endl;
}
void operator()(int val) {
set(val);
std::cout << get() << std::endl;
set(val * 2);
std::cout << get() << std::endl;
}
void set(int val) {
x = val;
}
int get() {
return x;
}
private:
int x;
};
int main(int argc, char const *argv[]) {
std::thread x = std::thread(ThreadClass(), 10);
x.join();
return 0;
}
输出:
正在构建。。。
复制正在构建。。。
复制正在构建。。。
正在破坏。。。
正在破坏。。。
10
20
正在破坏。。。
如果您想看到move构造函数也在运行,可以取消对其的注释。
直接回答您的问题:
为什么会发生这种情况?真诚地说,我期待的只是ThreadClass的一个实例。
之所以会发生这种情况,是因为您正在传递一个对象,所以文章中提到的其他构造函数会被多次调用。
为了避免意外行为,是否有必要重载某些类运算符?
您所说的意外行为是什么意思?这正是C++想要的。这是C++定义良好的行为。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- 子类化 std::thread:构造器中可变参数模板函数的问题
- 关于std::thread类的问题
- 来自 c++11 的 std::thread 的问题
- 将 boost/thread headers 与 clang++ (Windows) 一起使用时出现问题
- Printf调用与std::thread混淆,但std::cout没有问题