Я использую QT 4.3.1 (код устаревания должен использовать его), и я передаю ссылку класса между моим рабочим потоком и потоком графического интерфейса с использованием сигналов и слотов.QT 4.3 Передача указателя класса между потоками
Выполняет ли QT атомные операции над этим классом, если он состоит из нативных типов (Qstring, int, unsigned char) или мне еще нужен 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().
Я передаю ссылки между моим рабочим и 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);
атомарность не является составной. Два значения атомарного доступа, соединенные в структуру, не являются совместно атомарными. Атоматичность часто не обеспечивает достаточного потокобезопасного поведения. Безопасность потоков - это функция того, что вы делаете, и, следовательно, какие гарантии вам нужны. Простой способ обеспечения безопасности потоков - никогда не передавать данные, просто копировать. Все остальное имеет тенденцию быть более упрощенным, неправильным, очень сложным или часто одним или всеми тремя. – Yakk