【发布时间】:2020-05-19 02:23:09
【问题描述】:
我希望在 Qt 的线程之间使用信号/槽机制传递一个对象。由于我将传递一个指向对象的指针,因此在接收方调用对象上的方法是否安全?
根据这个问题question 没有复制对象(所以使用原始对象)。
这样安全吗?还是我在属于另一个线程中的一个线程的对象上执行方法?有没有更好的方法来做到这一点?
(我在这个类中有大约 20 个 getter,所以我不想传递单个变量,而且一些变量实际上也是指向对象的指针)
【问题讨论】:
-
它本身并不安全,c 你必须通过使用互斥体、原子等使传递的对象线程安全。但即使那样你也可能会遇到生命周期和所有权问题......
-
所以信号应该只发送基本类型(而不是对象)? Qt 文档说没问题 (doc.qt.io/qt-5/signalsandslots.html) 但没有提及这些问题。关于如何处理的任何参考 Qt 文档?
-
信号/槽可以与任何东西一起使用,但是只要您直接(通过指针)共享对象而不是复制它们(通过值/常量引用),通常的多线程同步问题就会应用。信号/插槽只是传递参数的一种方式,它们不控制访问对象后会发生什么。我想说跨线程信号/槽最好与值一起使用,然后实现线程间通信的消息传递编程模型。
-
@Frank:我认为这是迄今为止最好的答案——如果你回复我会接受