我有一个用于 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));
似乎有一个 NULL 指针被取消引用。
FWIW,TBB 使用延迟初始化机制进行初始化:
// at 'global' scope
tbb::task_scheduler_init g_tbbinit(tbb::task_scheduler_init::deferred);
...
// in a function
g_tbbinit.initialize();
有没有办法使这项工作?例如,TBB 是否需要特定的初始化以允许从“自定义”线程调用它?