线程创建对比
| A16,iOS 26 | 单位:us | 
|---|---|
| pthread_create | 97 | 
| __workq_kernreturn | 94 | 
1. 提交任务,workqueue机制
void dispatch_create_thread() {
    dispatch_queue_t queues[10];
    for (int i = 0; i < 10; i++) {
        queues[i] = dispatch_queue_create("Serial", nullptr);
        dispatch_async(queues[i], ^{
            pthread_setname_np("Other");
            sleep(100);
        });
    }
    sleep(1);
    dispatch_queue_t queue = dispatch_queue_create("Concurrent", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        pthread_setname_np("WorkerThread");
        cpu_intensive_work("test", 1);
    });
    
    sleep(2);
    
    exit(0);
}

Screenshot 2025-09-18 at 19.48.32.png

Screenshot 2025-09-18 at 19.49.00.png
2. 使用pthread_create

Screenshot 2025-09-18 at 19.55.46.png

Screenshot 2025-09-18 at 19.57.59.png
休眠唤醒对比
结果(计算从开始唤醒到runnable开始时间点的时间差)
| 单位:us | A10,iOS15.7 | A12,iOS18.5 | A16,iOS 26 | 
|---|---|---|---|
| cv_notify | 20 | 18 | 6 | 
| __workq_kernreturn | 26 | 24 | 9 | 
1. 使用cv_notify方式
代码
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
bool waited = false;
void* thread_func(void* ptr) {
    pthread_setname_np("WorkerThread");
    pthread_mutex_lock(&mutex);
    waited = true;
    pthread_cond_wait(&cond, &mutex);
    EMIT_EVENT("notify success");
    return nullptr;
}
void thread_notify() {
    sleep(1);
    pthread_t thread;
    pthread_create(&thread, nullptr, thread_func, nullptr);
    while (!waited);
    pthread_mutex_lock(&mutex);
    sleep(1);
   EMIT_EVENT("start notify");
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);  // 必须释放锁!
    pthread_join(thread, nullptr);
    sleep(1);
    exit(0);
}

Screenshot 2025-09-18 at 14.59.30.png

Screenshot 2025-09-18 at 15.00.20.png
2. gcd任务提交到worker唤醒
void submit_notify() {
    sleep(1);
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
        pthread_setname_np("WorkerThread1");
        cpu_intensive_work("test", 1);
    });
    
    sleep(2);
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
        pthread_setname_np("WorkerThread2");
        cpu_intensive_work("test", 1);
    });
    
    sleep(2);
    
    exit(0);
}

Screenshot 2025-09-18 at 15.13.12.png

Screenshot 2025-09-18 at 14.50.43.png

Screenshot 2025-09-18 at 14.51.12.png