如果我在两个不同的线程中使用两个不同的cairo_t
(以及相关的cairo_surface_t等)对象,我是否可以保证由于共享的全局状态而没有竞争条件?
我是否还可以正式将cairo_t
对象从一个线程传递到另一个线程而没有任何意外行为(可能来自线程本地存储)?
答案 0 :(得分:2)
此错误跟踪讨论应该回答您的问题:https://bugs.freedesktop.org/show_bug.cgi?id=74355
<强> 1。开罗应该是可重入的
Uli Schlachter 2014-02-03 18:25:06 UTC
(回复评论#0)
- 在线程之间共享一个cairo_surface_t,并拥有每个线程 使用自己的cairo_t绘制。这会崩溃,但也许我希望太多 (尽管图像表面基本上只是一个很大的字节数组 应该可以从多个线程写入)。
醇>当然,只是一个阵列。只要你期待任何事情,这就有效 喜欢有用的结果。开罗应该是线程安全的 线程不共享任何状态(嗯,这是一个 过度简化,但你的第一种方法不应该起作用。)
<强> 2。线程本地存储可能会使Pixman崩溃
SørenSandmannPedersen 2014-02-17 16:49:02 UTCpixman对Windows上的TLS支持很简单 越野车;可能不是很多人一直在使用pixman Windows上的多线程方式(或者解决了这个问题 某种方式)。我们需要某种方式来重现问题 知道。
在pixman 0.32.0及更高版本中,有一个名为的测试程序 'thread-test'可能会重现此问题,如果你可以让它运行 在Windows上。
作为一项政策,您应该始终认为第三方图书馆不是安全的,除非另有证明。
答案 1 :(得分:1)
由于你的标题要求重入:在cairo中没有很多回调,但只要你没有引起任何递归回调,你应该没问题。
开罗肯定不是信号安全的,我无法想象它是如此。
关于线程的实际问题: 在开罗没有那么多的全球状态,其中大部分都是通过适当的互斥体来保护的。有一些字体锁定错误。如果您遇到线程安全问题,并且可以编写一个不太大的,自包含的程序来重现问题,那么应该快速解决问题。因此,任何线程安全问题都被视为错误。
是的,这不适用于线程之间的共享状态。只有隐含使用的全局状态才受到保护。你不能同时在多个线程中使用任何cairo交给你的对象。但是你可以在线程之间自由移动对象。