【发布时间】:2015-12-13 15:07:58
【问题描述】:
我正在使用 QT 4.3.1(遗留代码必须使用它)并且我正在使用信号和插槽在我的工作线程和 GUI 线程之间传递一个类引用。
如果此类由本机类型(Qstring、int、unsigned char)组成,QT 是否会对此类执行原子操作,还是我仍然需要 QMutex?在线程之间传递类或数据缓冲区的引用是否安全,或者是否有更好的方法来共享它并防止并发访问?
我有一个类,COMinfo 由另一个类和一个使用本机类型的结构组成:
typedef struct Port_Check_Struct
{
U_BYTE command :4;
U_BYTE spare15_4 :2; /* spare bits */
U_BYTE status :2;
} PORT_CHECK_STRUCT;
class PortInfo
{
public:
PortInfo();
QString portName;
U_BYTE Dir;
UNSIGNED16 Addr;
U_BYTE Size;
bool active;
U_BYTE lastused;
U_BYTE currused;
U_BYTE errorCntr;
U_BYTE portBuff[100];
U_BYTE dataBuff[100];
PORT_CHECK_STRUCT *portCheck;
};
class COMInfo
{
public:
UNSIGNED8 errorStatus;
UNSIGNED16 COMaddr;
PortInfo portInfo[4];
};
// Define Meta Types for SIGNAL/SLOT CROSS THREAD TYPES
qRegisterMetaType<COMInfo>("COMInfo");
我使用 qRegisterMetaType() 将数据类型注册到 MOC。
我在我的工作线程和 GUI 线程之间传递引用,如下所示:
emit COM_DATA_UPDATE(COM_Info.portInfo[0].dataBuff)
QT 与此参考有何关系?是浅拷贝吗?需要复制构造函数吗?
信号定义为:
void COM_DATA_UPDATE(const U_BYTE* msg);
还有一个信号我通过了实际的 const 类引用:
void INFO_UPDATE(const COMInfo& comInfo);
【问题讨论】:
-
原子性是不可组合的。连接在结构中的两个原子访问值不是共同原子的。原子性通常不能提供足够的线程安全行为。线程安全是你正在做的事情的一个功能,因此你需要什么保证。拥有线程安全的简单方法是从不共享数据,只共享副本。其他所有内容往往过于简化、错误、非常复杂,或者通常两者兼而有之。
标签: c++ multithreading qt