Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
呼叫TBB';用于'的并行#u;在python线程中 我有一个Python的定制C++模块,它公开了函数,其中一些使用TBB(TBB21Al015OSS)来加速处理。_C++_Python_Windows_Tbb - Fatal编程技术网

呼叫TBB';用于'的并行#u;在python线程中 我有一个Python的定制C++模块,它公开了函数,其中一些使用TBB(TBB21Al015OSS)来加速处理。

呼叫TBB';用于'的并行#u;在python线程中 我有一个Python的定制C++模块,它公开了函数,其中一些使用TBB(TBB21Al015OSS)来加速处理。,c++,python,windows,tbb,C++,Python,Windows,Tbb,到目前为止,我在Win32环境中从Python(2.6.2)调用TBB加速函数时没有遇到任何问题 但是现在,当从Python线程(使用threading.threadclass创建)调用这样一个函数时,我遇到了一个问题——当从主Python线程调用同一个函数时,效果很好 调用函数将导致应用程序崩溃,并显示以下消息: First-chance exception at 0x03522e96 in python.exe: 0xC0000005: Access violation reading lo

到目前为止,我在Win32环境中从Python(2.6.2)调用TBB加速函数时没有遇到任何问题

但是现在,当从Python线程(使用
threading.thread
class创建)调用这样一个函数时,我遇到了一个问题——当从主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));

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

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

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


您可以尝试用较新版本机械替换tbb.dll是否有帮助。用最近版本的TBB重新编译上述C++模块将更好。如果设计约束不禁止的话,修改模块以分别为调用它的每个线程初始化TBB(以便它也能与旧版本一起工作),也可能有意义。

@Ugo-更新问题以添加更多信息谢谢,这看起来像我需要的,我很难从TBB文档中弄清楚这一点。我会尽快试一试。
// at 'global' scope
tbb::task_scheduler_init g_tbbinit(tbb::task_scheduler_init::deferred);  
...
// in a function
g_tbbinit.initialize();