Документация Qt заявляет это о поточной безопасности и повторного входа:
Примечание. Классы Qt документируются как поточно-ориентированные, только если они предназначены для использования несколькими потоками. Если функция не помечена как поточно-ориентированная или реентерабельная, ее не следует использовать из разных потоков. Если класс не помечен как потокобезопасный или реентерабельный, то к конкретному экземпляру этого класса нельзя обращаться из разных потоков.
Кажется, это говорит о том, что каждая функция и класс в Qt должны рассматриваться как не входящие и не ориентированные на многопотоковое исполнение, если это не указано явно.
Однако в документации QRect
а также QPoint
Например, не упоминается ни о безопасности потоков, ни о повторном входе, но мне трудно поверить, что это не так. По факту, эта старая дискуссия говорит «недостаток» в документации:
Эти классы являются просто обычными данными (несколько примитивов), не имеют общих структурированных или статических данных, поэтому они реентерабельны. То, что они не помечены как таковые, является недостатком нашей документации.
Итак, как мы должны знать, является ли функция реентерабельной или нет? Заметка о повторном входе опущена только для простых классов, где она подразумевается очевидностью?
Я думаю, что единственный безопасный ответ на этот вопрос — посмотреть на исходный код. Очевидно, что документы Qt не достаточны. Ошибки следует отправлять в Qt для каждого недокументированного реентерабельного класса.
Согласно определению Qt для повторного входа, существует два критерия для определения, является ли класс Qt реентерабельным:
Доступ к одноэлементному классу нарушил бы 2.
Других решений пока нет …