首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::pmr::set_default_resource在多线程程序中不可用吗?

std::pmr::set_default_resource在多线程程序中不可用吗?
EN

Stack Overflow用户
提问于 2020-07-21 00:46:51
回答 1查看 80关注 0票数 1

所以,我终于有了使用多态分配器的理由。

几乎立刻,我发现了一个致命的设计缺陷:[mem.res.global]/3-7没有直接说明它,但关于[mem.res.global]/6中同步的章节标题和评论似乎暗示std::pmr::get_default_resourcestd::pmr::set_default_resource使用单一的静态(即不是thread_local)默认内存资源指针。

我的读数正确吗?如果是这样的话,如何在多线程程序中使用多态分配器,考虑到在使用它们复制容器时,std::pmr::get_default_resource将被隐式地到处使用?我是否必须总是显式地传递分配器?

EN

回答 1

Stack Overflow用户

发布于 2020-08-27 03:01:35

我也在想同样的问题。

我写了一个简单的测试,其中两个线程按顺序更改/打印默认资源。

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
 task1 pool: 0x7fdcc1ee6ea0
 task2 pool: 0x7fdcc16e5ea0
 task1 pool: 0x7fdcc16e5ea0
 task2 pool: 0x7fdcc16e5ea0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63000116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档