У меня есть рабочий поток, который отправляет некоторые данные по TCP, беря эти данные из нескольких других потоков. Мне нужно заполнить некоторые данные, имеющие вид мьютекса поверх него, а затем вызвать метод другого потока, который затем разблокирует мьютекс, когда закончит, когда поток вызывающего абонента продолжит свою собственную работу.Синхронизация доступа к данным в разных потоках
Я первый реализовали это при помощи Qt следующим образом:
Data globalData;
QMutex mutex;
void requestSend() // several such functions in other threads
{
mutex.lock(); // we want to change the data
globalData=fillData();
invokeMethod(workerClass,"work",Qt::QueuedConnection);
}
void work() // a slot in a class instanced in worker thread
{
sendData(globalData);
mutex.unlock(); // data is now available to be changed
}
Это кажется разумным и даже работает, но потом я нашел это в документации QMutex:
аннулируются QMutex :: отпирания()
Открывает мьютексы. Попытка разблокировать мьютекс в другом потоке с тем, который заблокирован , приводит к ошибке. Разблокировка мьютекса, который не заблокирован, приводит к неопределенному поведению.
У меня есть два вопроса:
Что причина такого ограничения, чтобы разблокировать в другом потоке? (и почему я не вижу ошибки, о которых говорит doc?)
Что я должен использовать вместо QMutex для достижения того, что я пытаюсь сделать? Будет ли QWaitCondition быть адекватной заменой?
Почему бы не использовать слот сигнала для передачи данных напрямую или даже передать его вместе с вызовом 'invokeMethod' –
@ratchetfreak. Это будет связано с копированием данных, хотя я бы хотел его избежать. – Ruslan