与 tbb::task_arena 和 tbb::task_scheduler_observer 链接时出错

Posted

技术标签:

【中文标题】与 tbb::task_arena 和 tbb::task_scheduler_observer 链接时出错【英文标题】:Error while linking with tbb::task_arena and tbb::task_scheduler_observer 【发布时间】:2016-07-12 07:53:40 【问题描述】:

我想通过使用 tbb::task_scheduler_observer 连接到 tbb::task_arena。根据文档,这应该像shown here 一样工作。但是,当我尝试编译以下代码时

#define TBB_PREVIEW_TASK_ARENA 1
#include "tbb/task_scheduler_observer.h"
#include "tbb/task.h"
#include "tbb/task_arena.h"
class MyObserver : public tbb::task_scheduler_observer

  public:
    MyObserver( tbb::task_arena &a ) : tbb::task_scheduler_observer(a)
    
       observe(true); // activate the observer
    
    /*override*/ void on_scheduler_entry( bool worker ) 
    
      // Do something here
    
    /*override*/ void on_scheduler_exit( bool worker )  
;

#define TBB_PREVIEW_TASK_ARENA 1
#include "tbb/task_arena.h"

int main()

  tbb::task_arena a;
  MyObserver my(a);

我得到一个

undefined refference to `tbb::task_arena::internal_terminate()`

错误。使用 -ltbb 标志编译时,其他 tbb 函数(和类)工作正常。

我使用启用了 -std=c++11 的 Ubuntu 14.04 和 g++ 4.8.4。

【问题讨论】:

哪一行给你错误?我的意思是:如果您评论 MyObserver my(a); 行,您也会遇到同样的错误? 是的。它仍然会发生。 当您链接错误版本的 libtbb 时会发生这种情况。你有链接吗?请显示您的链接命令 g++ -o test my_observer.cpp main.cpp -ltbb -std=c++11 这是错误的版本吗?它适用于所有其他 tbb 功能。 【参考方案1】:

回答我自己的问题,这就是解决问题的方法。显然,采用 tbb::task_arena 的 task_scheduler_observer 是社区预览功能。您需要在包含标题之前启用它

#define TBB_PREVIEW_LOCAL_OBSERVER 1
#include "tbb/task_scheduler_observer.h"

会成功的。现在它编译得很好。此外,我从源代码构建库,而不是使用 ubuntu 存储库中提供的库。有一个可用的 CMake 构建 here

【讨论】:

以上是关于与 tbb::task_arena 和 tbb::task_scheduler_observer 链接时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 TBB 与 SSE2 内在函数混合

Centos下安装bowtie的问题与解决方法

结合英特尔 IPP 和 TBB

tbb::atomic和std::atomic的区别

tbb::atomic和std::atomic的区别 废弃

TBB 线程池意外增加