第三个参数start_routine、thread function里面,往往跑一个 main loop)
prefacepthread_create函数的第三个参数进入后 是不是往往都有一个init函数然后一个while循环一、init while loop几乎是线程函数的标准范式是的这是一个非常经典的线程函数模式。thread function、thread routine里跑一个main loopworker loop—— 强调这是个干活的线程或者dispatch loop —— 强调在分发任务pthread_create的第三个参数是线程入口函数其内部结构通常是void*thread_func(void*arg){/* 1. 初始化阶段 */my_context_t*ctx(my_context_t*)arg;// 解析参数、初始化局部状态、分配资源等init_something(ctx);/* 2. 主循环阶段 */while(running){// 等待事件阻塞或轮询wait_for_event();// 处理任务do_work(ctx);}/* 3. 清理阶段可选*/cleanup(ctx);returnNULL;}为什么几乎都是这个结构线程的本质是长期运行的独立执行流而不是执行一次就退出的任务。所以init 部分线程私有的初始化避免竞态比主线程里初始化更安全while 循环让线程持续存活不断处理事件/消息/任务退出条件通常是一个volatile bool running标志或者收到某个信号/消息常见的几种 while 内部模式模式典型写法适用场景条件变量等待pthread_cond_wait(cond, mutex)生产者-消费者轮询队列while (!queue_empty()) dequeue()任务调度select/epollepoll_wait(epfd, ...)网络 I/Osleep 节拍usleep(interval)定时器/心跳信号量sem_wait(sem)限流/同步一个更完整的实际例子工作线程void*worker_thread(void*arg){thread_pool_t*pool(thread_pool_t*)arg;// initlocal_cache_tcache;cache_init(cache);// main loopwhile(!pool-shutdown){pthread_mutex_lock(pool-mutex);// 没有任务就等待while(queue_empty(pool-queue)!pool-shutdown)pthread_cond_wait(pool-cond,pool-mutex);if(pool-shutdown){pthread_mutex_unlock(pool-mutex);break;}task_ttaskqueue_pop(pool-queue);pthread_mutex_unlock(pool-mutex);// 执行任务task.func(task.arg);}// cleanupcache_destroy(cache);returnNULL;}所以init while loop几乎是线程函数的标准范式在 Linux 内核源码、Redis、Nginx、各种线程池实现里都能看到完全一样的骨架。