2011-05-11 137 views
3

我有一個自定義的C++模塊,用於顯示函數,其中一些使用TBB(tbb21_015oss)加速處理。在Python線程中調用TBB'parallel_for'

到目前爲止,在Win32環境下從Python(2.6.2)調用TBB加速函數時,我沒有任何問題。

但是現在,從Python線程(使用threading.Thread類創建)調用此函數時遇到問題 - 在調用相同函數時,從主Python線程可以正常工作。

調用函數導致應用程序崩潰,並顯示以下消息:

First-chance exception at 0x03522e96 in python.exe: 
0xC0000005: Access violation reading location 0x000000c8. 

TBB.dll基地址爲0x03510000,並根據2005年MSVC調試器,墜毀代碼恰好從TBB的「parallel_for.h 」,顯然是在static void start_for::run( const Range& range, const Body& body, const Partitioner& partitioner)執行時:

start_for& a = *new(task::allocate_root(context)) start_for(range,body,const_cast<Partitioner&>(partitioner)); 

似乎有被取消引用一個NULL指針。

// at 'global' scope 
tbb::task_scheduler_init g_tbbinit(tbb::task_scheduler_init::deferred); 
... 
// in a function 
g_tbbinit.initialize(); 

有沒有辦法來完成這項工作:

FWIW,TBB通過使用延遲初始化機制初始化?例如,TBB是否需要特定的初始化以允許從「自定義」線程調用它?

+0

什麼是錯誤信息? – log0 2011-05-11 08:57:59

+0

@Ugo - 更新的問題,以添加更多的信息 – rotoglup 2011-05-11 09:18:15

回答

2

對於TBB 2.1,每個使用TBB的外部線程應首先創建自己的task_scheduler_init對象;一個全局對象將不起作用。

TBB的後續版本放寬了這個要求;現在這樣一個線程特定的初始化對象是隱式創建的,如果沒有的話。

你可能會嘗試用更新版本機械替換tbb.dll是否會對你有幫助。用最新版本的TBB重新編譯提到的C++模塊會更好。如果不禁止設計約束,那麼對模塊進行重新加工以單獨爲每個調用TBB的線程初始化TBB(以便它可以與舊版本一起使用),這也可能是合理的。

+0

謝謝,它看起來像我需要的東西,我很難從tbb文檔中弄清楚這一點。我會盡快嘗試。 – rotoglup 2011-05-11 18:05:07