【发布时间】:2018-04-16 20:52:32
【问题描述】:
我需要保留传递给线程的对象的引用。设置环境的方式我必须将应用程序特定的绘图保留在它启动的同一线程中。因此,我将应用程序初始化代码隐藏在一个线程中,然后获取对我感兴趣的自定义组件的引用。
这行不通。应用程序加载并显示正常,但主线程中指向应用程序的指针始终为null。即使我使用std::shared_ptr 或std::ref。我做什么似乎无关紧要,指针始终为空。
#include <thread>
#include <iostream>
class SomeClass {
public:
int value;
SomeClass() { value = 0; }
};
void ExecuteThread(SomeClass* c) {
c = new SomeClass();
c->value = 555;
}
int main(int argc, char** argv) {
SomeClass* c = nullptr;
// std::ref(c) doesn't work
// Have also tried passing std::shared_ptr<SomeClass>
std::thread t1 = std::thread(&ExecuteThread, c);
t1.join();
std::cout << "c: " << c << "\n";
std::cout << "c->value: " << c->value << "\n";
return 0;
}
【问题讨论】:
-
你误解了复制指针的作用。您有两个
Canvas指针,您只更改其中一个。 -
@RinatVeliakhmedov 我确实提到了为什么我需要这样做。 @DrewDormann 它是一个指针而不是一个值。即使我在指针周围使用
std::ref,问题也是一样的。 -
你能在没有 Qt 的情况下重现这个问题吗?
-
@Maverick 在您显示的代码中,您有两个不同的指针。改变一个不会改变另一个。 (您的问题与 Qt 无关,而是与指针的工作原理有关。)我无法使用
std::ref评论您代码中的错误,因为我看不到它。 -
@SergeyA 我使用具有一个成员变量的类为该问题编写了一个测试平台。同样的问题。所以它与QT无关。无论我尝试做什么以将引用传递给新线程,似乎 std::thread 都会复制。这是令人难以置信的误导,因为我在网上花了几个小时寻找在线传递指针和共享指针的方法,这就是他们所说的线程。
标签: c++ multithreading