开罗图形图书馆是否可以重入?

时间:2014-09-08 13:59:29

标签: c++ c cairo

如果我在两个不同的线程中使用两个不同的cairo_t(以及相关的cairo_surface_t等)对象,我是否可以保证由于共享的全局状态而没有竞争条件?

我是否还可以正式将cairo_t对象从一个线程传递到另一个线程而没有任何意外行为(可能来自线程本地存储)?

2 个答案:

答案 0 :(得分:2)

此错误跟踪讨论应该回答您的问题:https://bugs.freedesktop.org/show_bug.cgi?id=74355

<强> 1。开罗应该是可重入的

  

Uli Schlachter 2014-02-03 18:25:06 UTC

     

(回复评论#0)

     
    
        
  1. 在线程之间共享一个cairo_surface_t,并拥有每个线程     使用自己的cairo_t绘制。这会崩溃,但也许我希望太多     (尽管图像表面基本上只是一个很大的字节数组     应该可以从多个线程写入)。
  2.        
     

当然,只是一个阵列。只要你期待任何事情,这就有效   喜欢有用的结果。开罗应该是线程安全的   线程不共享任何状态(嗯,这是一个   过度简化,但你的第一种方法不应该起作用。)

<强> 2。线程本地存储可能会使Pixman崩溃

  SørenSandmannPedersen 2014-02-17 16:49:02 UTC

     

pixman对Windows上的TLS支持很简单   越野车;可能不是很多人一直在使用pixman   Windows上的多线程方式(或者解决了这个问题   某种方式)。我们需要某种方式来重现问题   知道。

     

在pixman 0.32.0及更高版本中,有一个名为的测试程序   'thread-test'可能会重现此问题,如果你可以让它运行   在Windows上。

作为一项政策,您应该始终认为第三方图书馆不是安全的,除非另有证明。

答案 1 :(得分:1)

由于你的标题要求重入:在cairo中没有很多回调,但只要你没有引起任何递归回调,你应该没问题。

开罗肯定不是信号安全的,我无法想象它是如此。

关于线程的实际问题: 在开罗没有那么多的全球状态,其中大部分都是通过适当的互斥体来保护的。有一些字体锁定错误。如果您遇到线程安全问题,并且可以编写一个不太大的,自包含的程序来重现问题,那么应该快速解决问题。因此,任何线程安全问题都被视为错误。

是的,这不适用于线程之间的共享状态。只有隐含使用的全局状态才受到保护。你不能同时在多个线程中使用任何cairo交给你的对象。但是你可以在线程之间自由移动对象。