所以,我终于有了使用多态分配器的理由。
几乎立刻,我发现了一个致命的设计缺陷:[mem.res.global]/3-7没有直接说明它,但关于[mem.res.global]/6中同步的章节标题和评论似乎暗示std::pmr::get_default_resource和std::pmr::set_default_resource使用单一的静态(即不是thread_local)默认内存资源指针。
我的读数正确吗?如果是这样的话,如何在多线程程序中使用多态分配器,考虑到在使用它们复制容器时,std::pmr::get_default_resource将被隐式地到处使用?我是否必须总是显式地传递分配器?
发布于 2020-08-27 03:01:35
我也在想同样的问题。
我写了一个简单的测试,其中两个线程按顺序更改/打印默认资源。
void task1 () {
std::pmr::monotonic_buffer_resource pool;
std::pmr::set_default_resource (&pool);
std::cout << "task1 pool: " << std::pmr::get_default_resource () << std::endl;
std::this_thread::sleep_for (std::chrono::milliseconds (1000));
std::cout << "task1 pool: " << std::pmr::get_default_resource () << std::endl;
}
void task2 () {
std::pmr::monotonic_buffer_resource pool;
std::this_thread::sleep_for (std::chrono::milliseconds (500));
std::pmr::set_default_resource (&pool);
std::cout << "task2 pool: " << std::pmr::get_default_resource () << std::endl;
std::this_thread::sleep_for (std::chrono::milliseconds (1000));
std::cout << "task2 pool: " << std::pmr::get_default_resource () << std::endl;
}表示默认资源是全局的,而不是每个线程的。
https://coliru.stacked-crooked.com/a/6dbe796556712089
结果:
task1 pool: 0x7fdcc1ee6ea0
task2 pool: 0x7fdcc16e5ea0
task1 pool: 0x7fdcc16e5ea0
task2 pool: 0x7fdcc16e5ea0https://stackoverflow.com/questions/63000116
复制相似问题