• std::thread::id如何转换为字符串或整数


    2023年11月25日 11:42:25注,重要!!!!!:以下写法只在gcc/g++/gnuc中正确,因为在msvc中std::thread::native_handle_type定义为void*而不是uint64!,如果要跨平台或跨编译器,请务必舍弃这种用法!!!!!!!!

    uint64_t GetThreadID_2()
    {
        std::thread::id threadId = std::this_thread::get_id();
    
    	//! 很好,因为std::thread::id类型只有一个数据成员且没有虚函数,可直接取地址获得内部的原生线程id成员
        return *(std::thread::native_handle_type*)(&threadId);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    #include 
    #include 
    #include 
    #include 
    
    size_t GetThreadID_1()
    {
        std::thread::id threadId = std::this_thread::get_id();
    
        //! 线程安全,因为std::hash只是一个仿函数,没有啥数据成员c,不存在资源竞争
        //! 唯一的问题就是返回的是原生线程id的哈希值,而不是原生id值
        static std::hash<std::thread::id> hasher;
        return hasher(threadId);
    }
    
    uint64_t GetThreadID_2()
    {
        std::thread::id threadId = std::this_thread::get_id();
    
    	//! 很好,因为std::thread::id类型只有一个数据成员且没有虚函数,可直接取地址获得内部的原生线程id成员
        return *(std::thread::native_handle_type*)(&threadId);
    }
    
    std::string GetThreadID_3()
    {
        std::thread::id threadId = std::this_thread::get_id();
    
        //! 线程不安全,请不要使用
        static std::ostringstream oss;
        oss.str(""); // 清空字符串流
        oss << threadId;
        return oss.str();
    }
    
    std::string GetThreadID_4()
    {
        //! 线程安全,稍稍会慢一点点,占用空间也会多一点点,不过使用简单
        std::thread::id threadId = std::this_thread::get_id();
        std::ostringstream oss;
        oss << threadId;
        return oss.str();
    }
    
    
    
    std::mutex Mutex;
    
    int main()
    {
        auto fun = [](){
            for (int i = 0; i < 100; ++i) {
                auto id = GetThreadID_3();
                Mutex.lock();
    //            printf("%zu\n", id);
                printf("%s\n", id.c_str());
                Mutex.unlock();
            }
        };
    
        std::thread T1(fun);
        std::thread T2(fun);
        std::thread T3(fun);
        std::thread T4(fun);
        std::thread T5(fun);
        std::thread T6(fun);
        std::thread T7(fun);
        std::thread T8(fun);
        std::thread T9(fun);
    
        T1.join();
        T2.join();
        T3.join();
        T4.join();
        T5.join();
        T6.join();
        T7.join();
        T8.join();
        T9.join();
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
  • 相关阅读:
    redis的原理和源码-慢查询日志&监视器
    Go语言进阶------>init()函数
    java计算机毕业设计河东街摊位管理系统源码+mysql数据库+系统+lw文档+部署
    Educational Codeforces Round 134 (Rated for Div. 2) A~D
    webpack-cli 在 webpack 打包中的作用
    网络通信IO模型上
    MTK平台Metadata的加载(1)——Metadata介绍
    【Linux】安装Nginx
    安装project2016失败:Windows Installer和即点即用版本的Office程序不能并行
    iOS的签名机制
  • 原文地址:https://blog.csdn.net/MYMarcoreus/article/details/133239865