[英]Is the Cairo Graphics Library Reentrant?
如果我在兩個不同的線程中使用兩個不同的cairo_t
(和相關的cairo_surface_t等)對象,我可以保證由於共享的全局狀態不會有競爭條件嗎?
我是否還可以正式將cairo_t
對象從一個線程傳遞到另一個線程而沒有任何意外行為(可能來自線程本地存儲)?
此錯誤跟蹤討論應該回答您的問題: 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繪制每個線程。 這會崩潰,但也許我希望太多(盡管圖像表面基本上只是一個應該可以從多個線程寫入的大字節數組)。
當然,只是一個陣列。 只要你期望有用的結果,這就有效。 只要線程不共享任何狀態,Cairo應該是線程安全的(好吧,這是過於簡單化,但是你的第一種方法不應該起作用)。
線程本地存儲可能會使Pixman崩潰
SørenSandmannPedersen 2014-02-17 16:49:02 UTC
pixman對Windows上的TLS的支持可能只是錯誤的; 可能不是很多人在Windows上以多線程方式使用pixman(或者以某種方式解決了這個問題)。 我們需要某種方式來重現問題才能知道。
在pixman 0.32.0及更高版本中,有一個名為“thread-test”的測試程序可能會重現此問題,如果你可以在Windows上運行它。
作為一項政策,您應該始終認為第三方圖書館不是安全的,除非另有證明。
由於你的標題要求重入:cairo中沒有很多回調,但只要你不引起任何遞歸回調,你應該沒問題。
開羅肯定不是信號安全的,我無法想象它是如此。
關於線程的實際問題:在開羅中沒有那么多的全局狀態,其中大多數都是通過適當的互斥體來保護的。 有一些字體鎖定錯誤。 如果您遇到線程安全問題,並且可以編寫一個不太大的,自包含的程序來重現問題,那么應該快速解決問題。 因此任何線程安全問題都被視為錯誤。
是的,這不適用於線程之間的共享狀態。 只有隱含使用的全局狀態才受到保護。 你不能同時在多個線程中使用任何cairo交給你的對象。 但是你可以在線程之間自由移動對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.