2011-08-03 32 views
0

https://developer.mozilla.org/En/Gecko_Plugin_API_Reference:Scripting_pluginsNPAPI線程模型:應該訪問全局變量受鎖保護嗎?

此API設計不是線程安全的。此API的線程模型是這樣的:通過此API的所有調用都是同步的,並且從此插件到此API中的方法的調用必須來自啓動插件的線程,並且同樣所有由瀏覽器調用此API中的方法保證來自同一個線程。將來對這個API的修改可能會提供一種機制來代理從一個線程到另一個線程的調用,以幫助從其他線程使用此API。

如果我要訪問一個全局變量在我的插件(所有實例之間共享,甚至在不同的頁面),我是否需要鎖定或做瀏覽器只使用一個線程與插件供大家交流實例?

回答

1

瀏覽器總是隻使用一個線程與所有實例的插件通信;你應該做同樣的回報,並且不要從主線程以外調用任何NPN_函數。請記住,如果您正在做任何事情可能會阻止主線程在所有您將要創建自己的線程,在這種情況下,您可能需要鎖定;然而,只爲瀏覽器?不,你不需要它們。 OK。

+0

OK。關於阻塞,如果我使用NPN_Get/PostURL進行I/O,瀏覽器是否會在同一個線程上調用NPP_NewStream/WriteReady/Write/DestroyStream?由於只有在瀏覽器有數據時才調用NPP_Write,所以I/O不應該阻塞主線程,對吧? – lmz

+0

瀏覽器始終只使用一個線程與所有實例的插件進行通信;你應該做同樣的回報,並且不要從主線程以外調用任何NPN_函數。 – taxilian

+0

是的,I/O不會阻塞主線程,因爲NPP_Write只會在瀏覽器有數據時被調用;也就是說,只要你在處理它時不阻塞主線程。如果你需要更多的例子來說明如何做到這一點,請查看FireBreath的源代碼(http://www.firebreath.org) – taxilian