[英]boost::fast_pool_allocator throwing Access Violation exception
[英]Is boost::fast_pool_allocator using null_mutex safe in the presence of allocator rebinding?
我想知道使用boost::fast_pool_allocator
和null_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.