Может ли Qt вызывать два слота одновременно, если их вызывают с одного и того же сигнала? - PullRequest
4 голосов
/ 18 сентября 2011

Если есть два слота в двух разных потоках, и эти слоты подключены к сигналу в третьем потоке.Может ли случиться так, что оба слота будут вызываться одновременно по сигналу или они будут вызываться синхронизированными каждый раз?

Я спрашиваю, потому что хочу отправить некоторую структуру данных обратного вызова (инкапсулированную с QSharedPointer) испросите, нужен ли внутри механизм блокировки.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Вам не нужно блокировать фактические вызовы сигналов / слотов, если вы используете Qt :: QueuedConnection для передачи информации вашим потокам, поскольку механизм QueuedConnection обрабатывает это потокобезопасным способом.

При этом вам все равно нужно защищать любую разделяемую память, к которой имеют доступ ваши потоки, независимо от того, как они были вызваны.Тот факт, что третий поток испустил один сигнал для вызова обоих слотов, не изменит этого.

0 голосов
/ 18 сентября 2011

Посмотрите здесь (официальная документация Qt для механизма сигналов / слотов Qt относительно потоков).

Каждый слот вызывается внутри своего потока, поэтому я почти уверен, что все может произойти.Вам следует установить механизм блокировки.

...