当前位置: 首页 > 知识库问答 >
问题:

创建thread::id到整数值的d::映射

干茂才
2023-03-14

我希望获取与已知固定整数关联的线程id,而不是获取任意id值。

#include <iostream>
#include <thread>
#include <mutex>
#include <map>
#include <vector>

using namespace std;

std::mutex mu;
std::map<std::thread::id, int> threadIDs;

void run(int i) {
    std::unique_lock<mutex> map_locker(mu);
    std::cout << "Thread " << threadIDs.insert(std::make_pair(std::this_thread::get_id(), i)) << endl;
    map_locker.unlock();
}

int main() {
    std::thread the_threads[3]; //array of threads
    for (int i = 0; i < 3; i++) {
        //launching the threads
        the_threads[i] = std::thread(run, i);
    }

    for (int i = 0; i < 3; i++) {
        the_threads[i].join();
    }
}

例如:

Thread ID     Integer value
4             0
2             1
5             2

我在运行上述代码时出错:

测验cpp:14:28:错误:二进制表达式('basic_ostream'的操作数无效

共有1个答案

荆城
2023-03-14

std::pair无法通过ostream打印(请查看此处允许的类型),因此您需要单独打印其成员:

lock_guard<mutex> map_locker(mu);
pair<thread::id, int> p = make_pair(this_thread::get_id(), i);
threadIDs.insert(p);
cout << "Thread (" << p.first << ", " << p.second << ")" << endl;

请注意,正如@FrançoisAndrieux所指出的,您不需要手动解锁unique_lock,因为当它被销毁(超出范围)时,它会自动解锁。

正如@JesperJuhl所说,在这种情况下,lock_guard是更好的实践(它提供了您正在寻找的最小功能)。

 类似资料:
  • 问题内容: 我正在学习elasticsearch。我已经在’mapping.json’中指定了映射。其内容是 当前的映射是 我使用以下命令为书籍创建映射 但是当列出所有映射时,我得到: 为什么不按Mapping.json文件中指定的方式创建书籍的映射? 问题答案: 请尝试一下

  • 预期的输出是值的排序数组:。

  • 假设我有一组字符串和一个散列函数(或任何单边函数)和一个测试函数。我想用Java8流创建一个从输入字符串到通过测试函数的哈希值的映射。我的问题是如何在中编写? 看来老的for循环是最简洁的解决方案。

  • <thread>头文件提供了管理和辨别线程的工具,并且提供函数,可让当前线程休眠。 头文件内容 namespace std { class thread; namespace this_thread { thread::id get_id() noexcept; void yield() noexcept; template<typename Rep,ty

  • 我可以创建std::数组: 它很好用。但我无法创建向量: 这给了我一个错误:

  • 如果我要创建一个数组,并用值初始化它,我会这样做 我想对ArrayList做同样的事情,并有类似的东西 上面这行代码不行,我理解。我试图传达我希望实现的目标。有没有办法在Java做到这一点,而不必做像 或者