什么是TBB?
TBB(Thread Building Blocks)是英特尔发布的一个库,全称为 Threading Building Blocks,里面包含了 Algorithms、Containers、Memory Allocation、Synchronization、Timing、Task Scheduling这六个模块。暂时我只用到了Memory Allocation模块,其他的没有用到。
摘自百度百科:TBB,Thread Building Blocks,线程构建模块,是Intel公司开发的并行编程开发的工具。OSCON 上,Intel 宣布,Threading Building Blocks,Intel 众多软件开发工具中的一个,open source 了。协议是 GPLv2。TBB 获得过 17 届 Jolt Productivity Awards,是一套 C++ 模板库,和直接利用 OS API 写程序的 raw thread 比,在并行编程方面提供了适当的抽象,当然还包括更多其他内容,比如 task 概念,常用算法的成熟实现,自动负载均衡特 性还有不绑定 CPU 数量的灵活的可扩展性等等。STL 之父,Alexander Stepanov 对此评价不错,他说“Threading Building Blocks… could become a basis for the concurrency dimension of the C++ standard library”。其他 TBB 的早期用户,包括 Autodesk,Sun,Red Hat, Turbo Linux 等亦然。现在 O’Reilly 已经出版了一本 Intel Threading Building Blocks: Outfitting C++ for Multi-core Processor Parallelism。
使用tbb_malloc有什么好处?
tbb_malloc是完全符合STL Allocator标准,完全可以作为STL中各种容器的内存适配器。纯纯的C++ style,各位cpper用起来想来应该会很舒服。
如何使用tbb_malloc?
tbb_malloc提供了多种申请内存的类以便使用的不同的场合,具体请查看官方文档。我们主要来看下tbb::cache_aligned_allocator< T >。
#include <tbb/cache_aligned_allocator.h>
namespace my_alloactor
{
struct alloc_maker
{
template <typename T>
static tbb::cache_aligned_allocator<T>& get_allocator()
{
static tbb::cache_aligned_allocator<T> ret;
return ret;
}
};
}
#define MY_ALLOC(T, n) ::my_alloactor::alloc_maker::get_allocator<T>().allocate(n)
#define MY_FREE(T, p, n) ::my_alloactor::alloc_maker::get_allocator<T>().deallocate(p, n)
#define MY_NEW(T) new ((void*)(::my_alloactor::alloc_maker::get_allocator<T>().allocate(1))) T
#define MY_DELETE(T, p) if (p) {::my_alloactor::alloc_maker::get_allocator<T>().destroy(p); ::my_alloactor::alloc_maker::get_allocator<T>().deallocate(p, 1);}
namespace my_alloactor
{
struct deleter
{
template <typename T>
void operator()(T* p)
{
MY_DELETE(T, p);
}
};
}
以上封装的使用方法如下:
my_t*mt=MY_NEW(my_t)(/* construct funtion arg list */)
当然了,你还可以直接用来作为容器的默认内存适配器,例如:
typedef std::vector<int, tbb::cache_aligned_allocator<int> > tbb_malloc_vector;
tbb_malloc_vector my_vec;
还可以将其改造成内存池,使用一个字节的char作为模板参数即可,如下:
tbb::cache_aligned_allocator<char>memory_pool;
void*mem=memory_pool.allocate(100);// 即可申请100字节的内存
tbb::cache_aligned_allocator<my_t> alloc;
void* mem = alloc.allocate(1);
my_t* mt = new(m)my_t(/*arg list*/)
申请多个自定义数据结构的内存:
tbb::cache_aligned_allocator<my_t>alloc;
my_t*array=(my_t*)alloc.allocate(100);
for(size_ti=0;i<100;++i)
{
array[i]=new(array[i])my_t(/*arg list*/)
}
不过需要注意的是如果循环过程中某个new失败了,需要释放之前new的内存以及数据。
tbb::cache_aligned_allocator<T>的用法也就这么多了,其他的几个allocate类也没用过,tbb的有一本书叫《Intel Threading Building Blocks: Outfitting C++ for Multi-core Processor Parallelism》,有中文版本,不过里面的例子也是非常少。
游戏项目中国外使用tbb的多,mangos中使用了tbb,大家有兴趣可以翻翻mangos的代码。
很多游戏启动的时候会提示找不到tbb_malloc.dll或者tbb.dll,玩家需要自己去tbb官网下载编译好的dll放进去。
更多的关于tbb的介绍可以查看官网介绍:http://www.intel.com/cd/software/products/apac/zho/319508.htm
btw.感谢nous对tbb用法的指导。