如何在线程之间传递大型容器?你能传递一个指针吗?陷阱,提示?我在下面举一个例子。
class Data {
QMap<int, SomeClass> _m; // большие
std::array<SomeClass, 1024*1024> _a;
public:
void initData();
};
class Worker : public QObject {
Q_OBJECT
Data *_d;
public:
Worker() : QObject() { _d = new Data; }
signals:
void finished(Data *d);
public slots:
void process() { _d->initData(); emit finished(_d); }
};
class Controller : public QObject {
Q_OBJECT
Data *_d;
public:
Controller(QObject *parent = nullptr) : QObject(parent) { }
void start() {
QThread *thr = new QThread;
Worker *w = new Worker;
w->moveToThread(thr);
connect(thr, &QThread::started, w, &Worker::process);
connect(w, &Worker::finished, this, [this] (Data *d) { _d = d;});
connect(w, &Worker::finished, this, &Controller::finished);
connect(w, &Worker::finished, thr, &QThread::quit);
connect(w, &Worker::finished, w, &Worker::deleteLater);
connect(thr, &QThread::finished, thr, &QThread::deleteLater);
thr->start();
}
signals:
void finished(Data *d);
};
UDP:使用智能指针时出现问题:信号到插槽智能指针
你可以传递一个指针。最好不要“原始”,而要“聪明”。如果你打算一次只从一个地方使用一个大对象,我建议
std::unique_ptr。在这种情况下,您不必考虑释放内存。据我所知,如果您总是只使用一个线程中的对象,就不会有任何陷阱。如果您正在计划由多个线程共享的“共享”对象,您至少需要熟悉互斥锁,并且通常更好地了解多线程编程和访问其中数据的概念。