Эквивалент RUSAGE_THREAD Дарвин? - PullRequest
1 голос
/ 13 апреля 2011

Мне нужно измерить использование процессором отдельных потоков на darwin. В Linux я использую getrusage (RUSAGE_THREAD, ...), но он недоступен для Дарвина.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Флаг getrusage RUSAGE_THREAD зависит от Linux.

getrusage из xnu выводит только сумму за процесс.

Информация о времени использования каждого потока поддерживается в task_basic_info структурекаждый поток.

Документация здесь http://www.gnu.org/software/hurd/gnumach-doc/Task-Information.html

Вот простой пример того, как получить task_basic_info struct http://blog.kuriositaet.de/?p=257

 task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)
1 голос
/ 04 апреля 2019

Используйте thread_info и введите mach_thread_self(), чтобы получить время загрузки ЦП для текущего потока.Следующее преобразует их в struct rusage.

#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;

    kern_err = thread_info(mach_thread_self(),
                           THREAD_BASIC_INFO,
                           (thread_info_t)&info,
                           &info_count);
    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;
}

...