首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等同于RUSAGE_THREAD达尔文?

等同于RUSAGE_THREAD达尔文?
EN

Stack Overflow用户
提问于 2011-04-14 00:26:24
回答 2查看 1.1K关注 0票数 2

我需要测量darwin上各个线程的cpu使用率。在linux上我使用getrusage(RUSAGE_THREAD,...)但它在达尔文上是不可用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-14 00:38:36

getrusage的RUSAGE_THREAD标志是特定于Linux的。

xnu的getrusage仅输出每个进程的sum。

关于每个线程的使用次数的信息保存在每个线程的task_basic_info结构中。

文档在这里http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html

下面是一个如何获取task_basic_info结构http://blog.kuriositaet.de/?p=257的简单示例

代码语言:javascript
复制
 task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)
票数 2
EN

Stack Overflow用户

发布于 2019-04-04 08:00:55

使用thread_info并传入mach_thread_self()来获取当前线程的CPU使用时间。下面将把它们转换成一个struct rusage

代码语言:javascript
复制
#include <mach/mach.h>
#include <sys/resource.h>
#include <errno.h>

int getrusage_thread(struct rusage *rusage)
{
    int ret = -1;
    thread_basic_info_data_t info = { 0 };
    mach_msg_type_number_t info_count = THREAD_BASIC_INFO_COUNT;
    kern_return_t kern_err;

    mach_port_t port = mach_thread_self();
    kern_err = thread_info(port,
                           THREAD_BASIC_INFO,
                           (thread_info_t)&info,
                           &info_count);
    mach_port_deallocate(mach_task_self(), port);

    if (kern_err == KERN_SUCCESS) {
        memset(rusage, 0, sizeof(struct rusage));
        rusage->ru_utime.tv_sec = info.user_time.seconds;
        rusage->ru_utime.tv_usec = info.user_time.microseconds;
        rusage->ru_stime.tv_sec = info.system_time.seconds;
        rusage->ru_stime.tv_usec = info.system_time.microseconds;
        ret = 0;
    } else {
        errno = EINVAL;
    }

    return ret;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5652463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档