C/C++ 获取当前CPU核心数量、当前线程ID、当前进程ID、多平台兼容性实现(MacOS/Windows/Linux/Android NDK API-21)

在这些平台上面已经测试过,OJ8K,没有问题。

但是它依赖于这篇文章指示的编译器平台宏判断定义。

C/C++ MACOS、Windows、Linux、HarmonyOS 平台宏判断-CSDN博客  

获取CPU核心数量

    int GetProcesserCount() noexcept {
        int count = 0;

#if defined(_WIN32) || defined(_WIN64)
        SYSTEM_INFO si;
        ::GetSystemInfo(&si);

        count = si.dwNumberOfProcessors;
#elif defined(__ANDROID_API__) && __ANDROID_API__ >= 23
        count = get_nprocs();
#elif defined(_SC_NPROCESSORS_ONLN)
        count = sysconf(_SC_NPROCESSORS_ONLN); // MAOOS && LINUX
#else
        count = std::thread::hardware_concurrency();        
#endif

        if (count < 1) {
            count = 1;
        }

        return count;
    }

获取当前进程ID

    int GetCurrentProcessId() noexcept {
#if defined(_WIN32) || defined(_WIN64)
        return ::GetCurrentProcessId();
#else
        return ::getpid();
#endif
    }

获取当前线程ID

    int64_t GetCurrentThreadId() noexcept {
#if defined(_WIN32) || defined(_WIN64)
        return ::GetCurrentThreadId();
#else
        // https://android.googlesource.com/platform/bionic/+/master/libc/bionic/gettid.cpp
        // ::gettid();
#if defined(SYS_gettid)
        return syscall(SYS_gettid); /* syscall(__NR_gettid) or syscall(SYS_gettid); */
#elif defined(__NR_gettid) || defined(_ANDROID)
        return syscall(__NR_gettid);
#else
        /* https://elliotth.blogspot.com/2012/04/gettid-on-mac-os.html */
        uint64_t tid;
        pthread_threadid_np(NULL, &tid);
  
        return static_cast<int64_t>(tid);
#endif
#endif
    }

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值