选择 STL 容器来存储线程

Choosing an STL container to store threads

本文关键字:存储 线程 STL 选择      更新时间:2023-10-16

我正在尝试选择最好的 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和谓词进行排序。