繁体   English   中英

在存在allocator重新绑定的情况下,boost :: fast_pool_allocator是否使用null_mutex?

[英]Is boost::fast_pool_allocator using null_mutex safe in the presence of allocator rebinding?

我想知道使用boost::fast_pool_allocatornull_mutex设置的安全性。

我知道以下是一个不安全的实例。 每种类型都实例化一个分配器。 因此,如果你有两个容器都使用fast_pool_allocator<int, …null_mutex> (比如说),它们将共享相同的分配器实例,从而邀请数据fast_pool_allocator<int, …null_mutex>

以下是一个更大的问题。 allocator接口允许重新绑定。 这意味着即使您认为使用的fast_pool_allocator具有不太可能与其他实例冲突的“本地”类型,容器也可以自由地将该分配器重新绑定到不同的类型,例如全局的类型,它会发生冲突。

所以问题是:具有null_mutex boost::fast_pool_allocator有多安全?

我相信pool_allocator和fast_pool_allocator都是线程安全的,

来自: http//www.boost.org/libs/pool/doc/html/header/boost/pool/pool_alloc_hpp.html

pool_allocator和pool_allocator都将从/向同一池分配/解除分配。

和fast_pool_allocator一样

如果在main()启动之前和main()结束之后只有一个线程运行,那么两个分配器都是完全线程安全的。

但是,与其他降低分配开销的方法相比,它们的性能不是很好。 我也一直在看谷歌的tcmalloc,它创建每个线程堆以避免锁定。

此参数的默认值为boost :: details :: pool :: default_mutex,它是boost :: details :: pool :: null_mutex的同义词(在编译器中关闭线程支持时(因此未设置BOOST_HAS_THREADS),或者使用BOOST_DISABLE_THREADS(Boost-wide禁用线程)或BOOST_POOL_NO_MT(仅限此库))或boost :: mutex(在编译器中启用了线程支持时)显式禁用了线程支持。

boost::mutex

为我设置了这就是为什么在我的线程测试中我没有问题 - 我猜这也将为你正确设置。

但如果没有那么你可能有一个问题,因为:

由于T的大小用于确定底层池的类型,因此不同类型的相同大小的每个分配器将共享相同的底层池。 标记类可防止在pool_allocator和fast_pool_allocator之间共享池。 例如,在sizeof(int)== sizeof(void *)的系统上,pool_allocator和pool_allocator都将从/向同一个池分配/解除分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM