当前位置:首页>Linux>重温并发任务:Linux 多线程同步利器条件变量

重温并发任务:Linux 多线程同步利器条件变量

  • 2026-02-05 00:42:07
重温并发任务:Linux 多线程同步利器条件变量

点击↑深色口袋物联,选择关注公众号,获取更多内容,不迷路


在glibc2.35中,pthread线程提供了5种同步机制,分别为条件变量、互斥锁、读写锁、自旋锁和屏障,本篇主要回顾条件变量

一、pthread 条件变量的核心作用

核心定义

在glibc2.35中,条件变量的定义在sysdeps/nptl/bits/pthreadtypes.h中pthread_cond_t

typedef union{  struct __pthread_cond_s __data;  char __size[__SIZEOF_PTHREAD_COND_T];  __extension__ long long int __align;} pthread_cond_t;

其中__data是真实的数据载体,包含了操作系统所需要的全部底层信息,__size,固定大小的字符数组,保证新旧版本的二进制兼容,以及一个长长整型变量,用于控制内存对齐

为什么要用union呢?首先这种设计模式被称为 “Tagged Union” 或 “Opaque Type”(不透明类型)的一种变体。对于编译器,它看到的是一个固定大小、固定对齐方式的变量类型;对于库开发者,可以通过 __data 来灵活修改内部实现细节;对于用户,只需声明 pthread_cond_t 变量并传给函数,不需要也不应该知道内部结构。

核心作用 & 设计初衷

条件变量的核心作用就是实现线程间「基于条件的有序协作」,解决「线程等待某个条件成立」的同步场景

简单说:让某个 / 某些线程进入阻塞休眠状态,等待「指定条件满足」,当其他线程触发该条件后,再唤醒等待的线程继续执行。

它是 Linux 下 POSIX 线程库的线程同步核心机制,一般必须与互斥锁 pthread_mutex_t 配合使用,缺一不可

条件变量解决的核心痛点

线程开发中,有一个高频场景:线程 A 需要等待某个条件成立才能执行(比如等待数据就绪、等待任务完成),如果没有条件变量,只能用两种低效方式实现:

  1. 1. sleep() 轮询:线程每隔一段时间判断条件,占用 CPU 资源,且时延不可控;
  2. 2. while(条件) 忙等:线程持续占用 CPU 循环判断条件,CPU 利用率直接拉满,性能暴跌。

条件变量完美解决以上问题,它的核心优势是:等待条件的线程会主动释放 CPU,进入内核休眠态,不占用任何 CPU 资源;条件满足时被精准唤醒,零 CPU 浪费

与互斥锁的职责划分(必懂!二者互补,不是替代)

很多人混淆条件变量和互斥锁的作用,这是入门核心误区,二者必须搭配使用,各司其职、缺一不可,核心分工如下:

✅ 互斥锁(pthread_mutex_t)→ 负责「互斥」

  • • 保护共享的条件判断变量(比如全局的标志位、计数器、缓冲区),保证多线程对共享变量的读写是原子操作,避免数据错乱;
  • • 核心能力:排他性访问共享资源,解决「能不能访问」的问题。

✅ 条件变量(pthread_cond_t)→ 负责「同步」

  • • 阻塞等待「条件成立」的线程,唤醒满足条件的线程继续执行;
  • • 核心能力:控制线程的执行顺序,解决「什么时候执行」的问题。

✅ 核心结论:条件变量 + 互斥锁 = 线程同步的黄金组合,能解决** 99%** 的线程有序协作场景。

二、pthread 条件变量核心使用场景(全覆盖,无冗余,所有场景均不可替代)

条件变量的使用场景,全部围绕其核心能力:线程等待条件 + 条件满足唤醒,是线程同步中不可替代的核心机制,所有场景均为 Linux 应用层开发的高频刚需,覆盖嵌入式、服务器、工业控制等所有领域,无任何技术替代方案,按使用频率排序如下:

✅ 场景 1:经典「生产者 - 消费者模型」【最核心场景,占比 90%】

这是条件变量的头号使用场景,没有之一。

  • • 业务逻辑:生产者线程生产数据(写入缓冲区),消费者线程消费数据(读取缓冲区);
  • • 同步需求:① 缓冲区为空时,消费者线程等待,直到生产者生产数据;② 缓冲区满时,生产者线程等待,直到消费者消费数据;
  • • 实现方式:用 2 个条件变量分别控制「空缓冲区」和「满缓冲区」,搭配一把互斥锁保护缓冲区,完美实现生产 / 消费的有序协作。
  • • 典型案例:嵌入式设备的传感器数据采集(生产者)+ 数据解析(消费者)、服务器的请求接收(生产者)+ 请求处理(消费者)。

✅ 场景 2:线程的「按需启停 / 任务触发」

  • • 业务逻辑:主线程控制多个工作线程的启停,工作线程平时休眠,主线程下发任务后唤醒线程执行,执行完毕后线程再次休眠;
  • • 同步需求:工作线程等待「任务就绪」的条件,主线程设置任务后唤醒线程,任务完成后线程重新进入等待;
  • • 核心优势:线程休眠时不占用 CPU 资源,任务触发时精准唤醒,CPU 利用率趋近于 0,这是嵌入式低功耗设备的标配方案。

✅ 场景 3:多线程的「初始化屏障」

  • • 业务逻辑:程序启动时,需要先执行初始化线程完成全局资源初始化(比如配置加载、硬件初始化、连接建立),初始化完成后,所有业务线程才能开始执行;
  • • 同步需求:所有业务线程等待「初始化完成」的条件,初始化线程完成后,调用pthread_cond_broadcast唤醒所有业务线程;
  • • 实现优势:相比 sleep 轮询,条件变量能做到「初始化完成立即唤醒」,无任何时延,效率拉满。

✅ 场景 4:多线程的「有序执行」

  • • 业务逻辑:需要严格控制线程的执行顺序,比如「线程 A→线程 B→线程 C」依次执行,或「线程组 A 执行完后,线程组 B 才能执行」;
  • • 同步需求:每个线程等待前一个线程执行完成的条件,前一个线程执行完毕后,唤醒下一个线程;
  • • 对比优势:相比用互斥锁实现的有序执行,条件变量的代码更简洁、逻辑更清晰,无任何轮询开销。

✅ 场景 5:超时等待场景(生产级必备)

  • • 业务逻辑:线程需要等待某个条件成立,但不能无限等待,超过指定时间后,无论条件是否满足,都要退出等待并执行兜底逻辑;
  • • 实现方式:使用pthread_cond_timedwait替代pthread_cond_wait,设置超时时间,超时后返回ETIMEDOUT,线程执行兜底逻辑;
  • • 典型案例:网络连接超时等待、硬件响应超时等待、任务超时处理,这是生产环境防卡死的核心方案。

三、pthread 条件变量 核心接口(全量 + 详解,无冗余,背会即用)

条件变量的所有接口都在 <pthread.h> 头文件中,编译时必须加 -lpthread 链接线程库,接口数量少、逻辑简单,所有接口均有固定使用范式,掌握后零出错,按使用频率排序如下,所有接口返回值:成功返回 0,失败返回错误码

✅ 1. 条件变量的初始化(2 种方式,按需选择)

方式 1:静态初始化(推荐,全局 / 静态变量使用)

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  • • 特点:一行完成初始化,无需手动销毁也不会内存泄漏,最简单高效,开发中 90% 场景用此方式。

方式 2:动态初始化(局部变量 / 堆变量使用)

int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
  • • 参数 1 cond:待初始化的条件变量地址;
  • • 参数 2 attr:条件变量属性,传NULL使用默认属性即可;
  • • 配套操作:动态初始化的条件变量,使用完毕必须调用pthread_cond_destroy销毁!

✅ 2. 条件变量的销毁(对应动态初始化)

int pthread_cond_destroy(pthread_cond_t *cond);
  • • 作用:释放条件变量占用的内核资源,避免内存泄漏;
  • • 注意:静态初始化的条件变量,不需要调用该接口

✅ 3. 阻塞等待条件成立(核心接口,最常用)

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

核心功能 + 底层执行逻辑(重中之重,必懂)

该接口执行时,会做「原子两步操作」,这是条件变量的核心设计,也是线程安全的保障:

  1. 1. 调用瞬间,自动释放传入的互斥锁 mutex
  2. 2. 线程立即进入阻塞休眠状态,等待被其他线程唤醒;
  3. 3. 当线程被唤醒(pthread_cond_signal/broadcast)后,线程会自动重新获取这把互斥锁,获取成功后,才会从pthread_cond_wait返回,继续执行后续代码。

关键注意

  • • 线程在休眠期间,不占用 CPU 资源,这是条件变量的核心优势;
  • • 唤醒后必须重新抢锁,保证后续访问共享变量的线程安全。

✅ 4. 超时阻塞等待条件成立(进阶接口,生产级必备)

int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
  • • 作用:和pthread_cond_wait功能一致,区别是增加了超时时间,超时后无论条件是否满足,都会自动返回;
  • • 参数 3 abstime绝对时间(不是相对超时时间),格式是struct timespec,包含秒 + 纳秒;
  • • 返回值:超时返回ETIMEDOUT,成功返回 0,失败返回其他错误码;
  • • 核心价值:避免线程永久阻塞,是生产环境必用的防卡死方案。

✅ 5. 唤醒等待的线程(2 个唤醒接口,按需选择)

接口①:唤醒「至少一个」等待该条件的线程(精准唤醒,推荐)

int pthread_cond_signal(pthread_cond_t *cond);
  • • 核心特点:只唤醒等待队列中的任意一个线程(内核调度策略决定),不会唤醒全部;
  • • 适用场景:生产 / 消费模型、单任务唤醒,精准高效,是开发中最常用的唤醒方式。

接口②:唤醒「全部」等待该条件的线程(广播唤醒)

int pthread_cond_broadcast(pthread_cond_t *cond);
  • • 核心特点:唤醒等待队列中的所有线程,所有被唤醒的线程会重新竞争互斥锁,抢到锁的线程先执行;
  • • 适用场景:多个线程等待同一个条件,条件满足时需要所有线程同时执行(比如初始化完成后,所有业务线程一起启动)。

四、条件变量 核心对比(3 组高频对比,厘清技术边界,选型不迷茫)

✅ 对比 1:条件变量 vs 互斥锁(最核心对比,必懂)

二者是互补关系,不是替代关系,所有条件变量必须搭配互斥锁使用,核心差异总结如下,一目了然:

特性
条件变量 (pthread_cond_t)
互斥锁 (pthread_mutex_t)
核心职责
线程同步:控制执行顺序
线程互斥:保护共享资源
核心能力
阻塞等待条件、唤醒线程
排他性访问、加锁 / 解锁
资源占用
等待时释放 CPU,休眠态
加锁失败时阻塞,占用 CPU
适用场景
线程间有序协作、条件等待
共享资源的原子读写
依赖关系
必须依赖互斥锁
可独立使用
核心关键词
等待、唤醒、条件
加锁、解锁、排他

✅ 核心结论:互斥锁解决「能不能访问」,条件变量解决「什么时候访问」

✅ 对比 2:pthread_cond_signal vs pthread_cond_broadcast

二者都是唤醒线程的接口,属于同类型接口的选型对比,无优劣之分,按需选择即可:

✔️ pthread_cond_signal(精准唤醒)

  • • 优点:只唤醒一个线程,线程调度开销小,性能高;
  • • 缺点:只能唤醒一个线程,无法满足多线程同时执行的需求;
  • • 适用场景:单生产者单消费者、单任务唤醒、精准通知,开发中 90% 场景用此接口。

✔️ pthread_cond_broadcast(广播唤醒)

  • • 优点:唤醒所有等待线程,满足多线程协作的需求;
  • • 缺点:线程调度开销大,可能产生惊群效应;
  • • 适用场景:多线程等待同一条件、初始化完成后唤醒所有线程、批量任务触发。

✅ 选型原则:能精准唤醒,绝不广播唤醒

✅ 对比 3:pthread_cond_wait vs pthread_cond_timedwait

二者都是等待条件的接口,核心差异是「是否有超时机制」:

✔️ pthread_cond_wait(无限等待)

  • • 优点:接口简单,无需设置超时时间;
  • • 缺点:条件不满足时,线程永久阻塞,存在卡死风险;
  • • 适用场景:测试环境、条件必然会满足的业务场景。

✔️ pthread_cond_timedwait(超时等待)

  • • 优点:超时后自动返回,避免线程永久阻塞,生产环境必备;
  • • 缺点:需要设置绝对时间,接口稍复杂;
  • • 适用场景:生产环境所有场景,尤其是网络、硬件、超时任务等场景,推荐优先使用

✅ 生产原则:线上代码,优先使用超时等待

五、 3个完整示例(拿来就能跑)

代码才是硬道理。下面三个例子,涵盖了基础、超时和广播,直接拷贝到你的 ARM Linux 开发板上就能跑(记得编译加 -lpthread)。

示例 1:基础的生产者-消费者模型

这是最经典的用法。一个线程写数据,一个线程读数据。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#define BUFFER_SIZE 5typedef struct {    int buffer[BUFFER_SIZE];    int in;    int out;    int count;} CircularBuffer;CircularBuffer cb = {0};pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER;pthread_cond_t not_full = PTHREAD_COND_INITIALIZER;// 生产者void* producer(void *arg) {    int item = 0;    while (1) {        item++;        pthread_mutex_lock(&lock);        // 关键点1:满了就等,必须用while        while (cb.count == BUFFER_SIZE) {            printf("【生产者】缓冲区满了,休息一下...\n");            pthread_cond_wait(&not_full, &lock);        }        // 写数据        cb.buffer[cb.in] = item;        cb.in = (cb.in + 1) % BUFFER_SIZE;        cb.count++;        printf("【生产者】放入数据 %d, 当前数量: %d\n", item, cb.count);        // 唤醒消费者        pthread_cond_signal(&not_empty);        pthread_mutex_unlock(&lock);        sleep(1); // 模拟生产耗时    }    return NULL;}// 消费者void* consumer(void *arg) {    while (1) {        pthread_mutex_lock(&lock);        // 关键点2:空了就等,必须用while        while (cb.count == 0) {            printf("【消费者】缓冲区空了,等待数据...\n");            pthread_cond_wait(&not_empty, &lock);        }        // 取数据        int item = cb.buffer[cb.out];        cb.out = (cb.out + 1) % BUFFER_SIZE;        cb.count--;        printf("【消费者】取出数据 %d, 当前数量: %d\n", item, cb.count);        // 唤醒生产者        pthread_cond_signal(&not_full);        pthread_mutex_unlock(&lock);        sleep(2); // 模拟消费耗时    }    return NULL;}int main() {    pthread_t pro, con;    pthread_create(&pro, NULL, producer, NULL);    pthread_create(&con, NULL, consumer, NULL);    pthread_join(pro, NULL);    pthread_join(con, NULL);    pthread_mutex_destroy(&lock);    pthread_cond_destroy(&not_empty);    pthread_cond_destroy(&not_full);    return 0;}
输出结果 如下

示例 2:带超时的等待(BSP 场景常用)

在实际 BSP 调试或驱动开发中,我们经常不能无限等硬件。这个例子演示了 pthread_cond_timedwait 的用法。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#include <time.h>#include <errno.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int data_ready = 0;// 模拟硬件中断或另一个线程发送信号void* hardware_thread(void *arg) {    printf("[硬件] 正在初始化硬件...\n");    sleep(3); // 模拟硬件初始化耗时3秒    printf("[硬件] 初始化完成!\n");    pthread_mutex_lock(&mutex);    data_ready = 1;    pthread_cond_signal(&cond); // 发送信号    pthread_mutex_unlock(&mutex);    return NULL;}// 模拟应用层等待硬件void* app_thread(void *arg) {    struct timespec ts;    clock_gettime(CLOCK_REALTIME, &ts);    ts.tv_sec += 2; // 只等2秒    pthread_mutex_lock(&mutex);    printf("[应用] 等待硬件就绪 (超时2秒)...\n");    // 等待,带超时    int ret = pthread_cond_timedwait(&cond, &mutex, &ts);    if (ret == ETIMEDOUT) {        printf("[应用] 超时了!硬件可能出问题了。\n");    } else {        printf("[应用] 收到信号,硬件就绪成功!\n");    }    pthread_mutex_unlock(&mutex);    return NULL;}int main() {    pthread_t t_hw, t_app;    pthread_create(&t_hw, NULL, hardware_thread, NULL);    pthread_create(&t_app, NULL, app_thread, NULL);    pthread_join(t_hw, NULL);    pthread_join(t_app, NULL);    pthread_mutex_destroy(&mutex);    pthread_cond_destroy(&cond);    return 0;}
输出结果如下

示例 3:广播机制

当有多个消费者线程,但只需要一个生产者发送一次通知,所有消费者都要醒来干活时,必须用 broadcast。比如重新加载配置文件。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t cond = PTHREAD_COND_INITIALIZER;int config_updated = 0;void* worker(void *arg) {    int id = *(int*)arg;    pthread_mutex_lock(&lock);    while (config_updated == 0) {        printf("[Worker %d] 正在等待配置更新...\n", id);        pthread_cond_wait(&cond, &lock); // 所有线程都在这等着    }    printf("[Worker %d] 收到广播!开始应用新配置...\n", id);    pthread_mutex_unlock(&lock);    return NULL;}void* master(void *arg) {    sleep(2); // 模拟读取配置文件    pthread_mutex_lock(&lock);    config_updated = 1;    printf("[Master] 配置已更新,通知所有 Worker!\n");    pthread_cond_broadcast(&cond); // 一次性叫醒所有人    pthread_mutex_unlock(&lock);    return NULL;}int main() {    pthread_t master_tid;    pthread_t workers[3];    int ids[3] = {1, 2, 3};    pthread_create(&master_tid, NULL, master, NULL);    for(int i=0; i<3; i++) {        pthread_create(&workers[i], NULL, worker, &ids[i]);    }    pthread_join(master_tid, NULL);    for(int i=0; i<3; i++) {        pthread_join(workers[i], NULL);    }    pthread_mutex_destroy(&lock);    pthread_cond_destroy(&cond);    return 0;}
执行结果如下

六、pthread 条件变量 的优缺点(完整总结,客观全面,选型参考)

✅ 优点(核心优势,无可替代)

  1. 1. 极致的 CPU 利用率:等待条件的线程进入休眠态,不占用任何 CPU 资源,相比轮询 / 忙等,CPU 利用率趋近于 0,这是条件变量的核心优势;
  2. 2. 精准的线程协作:能实现基于条件的有序执行,完美解决线程间的依赖关系,逻辑清晰、代码简洁;
  3. 3. 规避虚假唤醒:通过while(条件)循环判断,可完全兼容 Linux 内核的虚假唤醒特性,线程安全;
  4. 4. 低开销高并发:条件变量的唤醒 / 等待操作,都是轻量级的内核调用,开销极低,能支撑高并发场景;
  5. 5. 灵活的唤醒策略:支持精准唤醒和广播唤醒,能适配所有线程协作场景;
  6. 6. 超时保护机制:通过 timedwait 实现超时等待,避免线程永久阻塞,生产环境友好。

✅ 缺点(局限性,客观认知,避坑即可)

  1. 1. 必须依赖互斥锁:条件变量无法独立使用,必须搭配互斥锁,增加了少量的代码复杂度;
  2. 2. 存在虚假唤醒:虽然可以通过while(条件)规避,但这是内核设计特性,需要开发者主动兼容;
  3. 3. 广播唤醒有性能开销:调用 broadcast 时,会唤醒所有等待线程,产生一定的调度开销;
  4. 4. 超时时间是绝对时间:timedwait 的超时参数是绝对时间,需要通过 clock_gettime 获取当前时间,接口稍复杂;
  5. 5. 无法直接传递数据:条件变量只能实现线程的唤醒,无法直接传递数据,数据传递需要依赖共享变量。

✅ 优缺点总结

✔️ 条件变量的优点是压倒性的,是线程同步中最优的条件等待方案,没有任何技术能替代其核心价值;

✔️ 条件变量的缺点都是可规避的,通过规范的代码编写和合理的接口选型,能轻松解决所有局限性;

✔️ 结论:条件变量是 Linux 线程同步的必学、必会、必用的核心技术,没有之一。


全文核心总结(精华提炼,直击本质,背会即用)

  1. 1. 条件变量的核心是「等待 + 唤醒」,必须搭配互斥锁使用,互斥锁保资源安全,条件变量控执行顺序;
  2. 2. 黄金法则:while(条件)包裹 wait,先加锁再 wait,唤醒必持锁,遵守这三句话,永不踩坑;
  3. 3. 核心接口只有 6 个,初始化→等待→唤醒→销毁,逻辑简单,固定范式,极易掌握;
  4. 4. 最核心场景是生产者 - 消费者模型,其次是线程启停、初始化屏障、超时等待;
  5. 5. 条件变量的优势是极致的 CPU 利用率,缺点是需要兼容虚假唤醒和依赖互斥锁,整体瑕不掩瑜;
  6. 6. 生产环境中,优先使用pthread_cond_timedwaitpthread_cond_signal,兼顾安全性和性能。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 13:37:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/472094.html
  2. 运行时间 : 0.113296s [ 吞吐率:8.83req/s ] 内存消耗:4,519.42kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c27bae19689bc9f2e7e3dd745d93f501
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000534s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000737s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000370s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000271s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000625s ]
  6. SELECT * FROM `set` [ RunTime:0.001248s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000722s ]
  8. SELECT * FROM `article` WHERE `id` = 472094 LIMIT 1 [ RunTime:0.004361s ]
  9. UPDATE `article` SET `lasttime` = 1770442623 WHERE `id` = 472094 [ RunTime:0.005396s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000470s ]
  11. SELECT * FROM `article` WHERE `id` < 472094 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001205s ]
  12. SELECT * FROM `article` WHERE `id` > 472094 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000781s ]
  13. SELECT * FROM `article` WHERE `id` < 472094 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002163s ]
  14. SELECT * FROM `article` WHERE `id` < 472094 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.021586s ]
  15. SELECT * FROM `article` WHERE `id` < 472094 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004951s ]
0.115723s