选择 STL 容器来存储线程
Choosing an STL container to store threads
我正在尝试选择最好的 STL 容器来容纳 Thread 对象(我正在编写线程库)。我的问题是我对它们中的任何一个都不是很熟悉,在阅读 api 帮助时,我想咨询以前使用过它的人。
无论如何 - 每个Thread
对象都有两个重要属性:_id
和_priority
。我需要能够通过_id
访问线程,所以我自然而然地想到了一个hash_map。我还希望对象按_priority
排序(不同的 Thread 对象可以具有相同的优先级),所以我想到了一个带有指向hash_map的指针的优先级队列,但是如果我删除一个不在队列中第一个的线程,它会变得有点丑陋。
有没有更好的解决方案?谢谢!
要获得两种类型的访问权限,您需要组合两个容器...或者重用为您组合容器的库。
Boost.MultiIndex正是为这种需求而发明的。
基本页面显示了一个示例,其中员工按 id(唯一)访问并按名称(非唯一)排序,这几乎就是您想要的。
密钥提取器可能并不明显。假设您的线程类似于:
class Thread {
public:
std::size_t id() const;
std::size_t priority() const;
...
};
你应该能够写:
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/const_mem_fun.hpp>
#include <boost/multi_index/member.hpp>
// define a multiply indexed set with indices by id and name
typedef multi_index_container<
Thread,
indexed_by<
ordered_unique<
const_mem_fun<Thread, std::size_t, &Thread::id>
>,
ordered_non_unique<
const_mem_fun<Thread, std::size_t, &Thread::priority>
>
>
> ThreadContainer;
它定义了由其id()
唯一标识并根据其priority()
排序的线程容器。
我鼓励你尝试各种索引。此外,如果您提供对类或返回可变引用的特定 getter 的好友访问权限,则使用 mem_fun
而不是 const_mem_fun
您将能够就地更新对象(例如,更改它们的优先级)。
这是一个非常完整(如果令人生畏)的库。
解决方案是保留std::unordered_map
以提供密钥 -->线程查找,然后使用std::set
来实现优先级队列。
最好的解决方案可能是std::map
,为您提供一个键/值对。在您的方案中,键具有_id
的类型和类型Thread
的值(假设这是类的名称)。通过将所有值复制到std::vector
可以按_priority
std::sort
和谓词进行排序。
- 将线程中的数据存储到全局容器的最佳方法?
- C++ 多线程原子加载/存储
- 混合 c++ 和 .net 的线程本地存储
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 线程上下文上的静态存储对象优化
- 在容器中存储指向对象的指针时的线程安全
- 多线程存储到文件中
- 如何使一个线程中的内存存储"promptly"在其他线程中可见?
- 创建一个以存储线程并调用它们的类
- Apache 崩溃并显示错误 R6016 没有足够的空间来存储线程数据
- Valgrind:在多线程程序中发现冲突的存储/加载
- C 静态与线程存储持续时间破坏顺序
- 线程特定数据与线程本地存储
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储
- 线程本地存储(TLS)和OpenMP
- 线程本地存储构造函数 g++
- 在C++中将所有TLS(线程本地存储)变量设置为新的单个值
- 如何确保变量在不同的线程读取它们之前存储到内存中
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 选择 STL 容器来存储线程