在python线程中调用TBB'intertra_for'

时间:2011-05-11 08:43:59

标签: c++ python windows tbb

我有一个用于python的自定义c ++模块,它公开了函数,其中一些函数使用TBB(tbb21_015oss)来加速处理。

到目前为止,在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,根据MSVC 2005调试器,崩溃发生在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));

似乎有一个空指针被解除引用。

FWIW,TBB通过使用延迟初始化机制进行初始化:

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

有没有办法让这项工作?例如,TBB是否需要特定的初始化以允许从“自定义”线程调用它?

1 个答案:

答案 0 :(得分:2)

使用TBB 2.1,每个使用TBB的外部线程都应该首先创建自己的task_scheduler_init对象;单个全局对象将无法工作。

TBB的后续版本放宽了这一要求;现在,如果不存在,则隐式创建这样一个特定于线程的初始化对象。

您可以尝试使用更新版本机械替换tbb.dll对您有所帮助。使用最新版本的TBB重新编译上述C ++模块将会更好。重新设计模块以便为调用它的每个线程单独初始化TBB(这样它也适用于旧版本),如果设计约束不被禁止,也可能有意义。