如何计算iOS中的活动线程数

del*_*una 2 multithreading objective-c ios

我想获得iOS应用程序中"活着"的线程数.

我可以threadDictionaryNSThread课堂上使用吗?或者我可以使用mach/thread_info.h

Emm*_*uel 6

Michael Dautermann已经回答了这个问题,但这是使用Mach API获取线程数的一个例子. 请注意,它仅在模拟器上工作(使用iOS 6.1测试),在设备上运行它将失败,因为task_for_pid返回KERN_FAILURE.

/**
 * @return -1 on error, else the number of threads for the current process
 */
static int getThreadsCount()
{
    thread_array_t threadList;
    mach_msg_type_number_t threadCount;
    task_t task;

    kern_return_t kernReturn = task_for_pid(mach_task_self(), getpid(), &task);
    if (kernReturn != KERN_SUCCESS) {
        return -1;
    }

    kernReturn = task_threads(task, &threadList, &threadCount);
    if (kernReturn != KERN_SUCCESS) {
        return -1;
    }
    vm_deallocate (mach_task_self(), (vm_address_t)threadList, threadCount * sizeof(thread_act_t));

    return threadCount;
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*asz 6

这个也适用于设备:

#include <pthread.h>
#include <mach/mach.h>
// ...
thread_act_array_t threads;
mach_msg_type_number_t thread_count = 0;

const task_t    this_task = mach_task_self();
const thread_t  this_thread = mach_thread_self();

// 1. Get a list of all threads (with count):
kern_return_t kr = task_threads(this_task, &threads, &thread_count);

if (kr != KERN_SUCCESS) {
    printf("error getting threads: %s", mach_error_string(kr));
    return NO;
}

mach_port_deallocate(this_task, this_thread);
vm_deallocate(this_task, (vm_address_t)threads, sizeof(thread_t) * thread_count);
Run Code Online (Sandbox Code Playgroud)