Является ли графическая библиотека Cairo реентерабельной?

Если я использую два разных объекта cairo_t (и связанных с ними cairo_surface_t и т. д.) в двух разных потоках, могу ли я гарантировать, что не будет условий гонки из-за общего глобального состояния?

Могу ли я также формально передать объект cairo_t из одного потока в другой без какого-либо неожиданного поведения (возможно, связанного с локальным хранилищем потока)?


person doron    schedule 08.09.2014    source источник


Ответы (2)


Это обсуждение по отслеживанию ошибок должно ответить на ваши вопросы: https://bugs.freedesktop.org/show_bug.cgi?id=74355

<сильный>1. Каир должен вернуться

Ули Шлахтер 2014-02-03 18:25:06 UTC

(В ответ на комментарий №0)

  1. совместно использовать один cairo_surface_t между потоками, и каждый поток рисует, используя свой собственный cairo_t. Это дает сбой, но, возможно, я слишком много надеюсь (хотя поверхность изображения, по сути, представляет собой просто большой массив байтов, который должен быть доступен для записи из нескольких потоков).

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

<сильный>2. Локальное хранилище потоков может привести к сбою Pixman

Сёрен Сандманн Педерсен 17 февраля 2014 г. 16:49:02 UTC

Возможно, поддержка TLS в Windows у pixman просто глючная; возможно, немногие используют pixman в многопоточном режиме в Windows (или каким-то образом решают эту проблему). Нам понадобится какой-то способ воспроизвести проблему, чтобы знать.

В pixman 0.32.0 и более поздних версиях есть тестовая программа под названием «thread-test», которая может воспроизвести эту проблему, если вы сможете запустить ее в Windows.

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

person lucasg    schedule 08.09.2014
comment
+1 за последнюю строку. Я бы пошел еще дальше и предложил вам всегда считать сторонние библиотеки небезопасными/непригодными для использования, пока не доказано обратное. :-) - person R.. GitHub STOP HELPING ICE; 08.09.2014
comment
Кажется, это указывает на то, что cairo должен быть реентерабельным (если нет ошибки) - person doron; 08.09.2014

Поскольку ваш заголовок требует повторного входа: в cairo не так много обратных вызовов, но пока вы не вызываете рекурсивных обратных вызовов, все должно быть в порядке.

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

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

И да, это не относится к совместному использованию состояния между потоками. Защищено только неявно используемое глобальное состояние. Вы не можете использовать какой-либо объект, переданный вам cairo, в нескольких потоках одновременно. Но вы можете свободно перемещать объект между потоками.

person Uli Schlachter    schedule 09.09.2014