当前位置:首页>Linux>重温并发任务:Linux 多线程同步利器互斥锁

重温并发任务:Linux 多线程同步利器互斥锁

  • 2026-02-05 01:05:54
重温并发任务:Linux 多线程同步利器互斥锁

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


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

一、pthread 互斥锁的核心作用(本质 + 定位,吃透核心价值)

✅ 核心定义

在glibc2.35中,互斥锁的定义在sysdeps/nptl/bits/pthreadtypes.h中pthread_mutex_t,其结构与条件变量类似

typedef union{  struct __pthread_mutex_s __data;  char __size[__SIZEOF_PTHREAD_MUTEX_T];  long int __align;} pthread_mutex_t;

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

为什么条件变量是long long int,而互斥锁是long int?互斥锁的内部数据__data,关键字段都是32位整型,所以用 long int(通常 4 字节)。条件变量的内部数据__data,实现比互斥锁复杂得多,在现代 Linux (NPTL) 实现中,为了保证高并发下的正确性,内部使用了 64 位的序列计数器。必须进行 8 字节对齐,所以使用了 long long int(通常 8 字节)

✅ 核心作用 & 设计初衷

互斥锁的核心作用只有一个:保证多个线程对「共享资源」的「排他性访问」

同一时间,只有一个线程能持有互斥锁、访问被保护的共享资源;其他线程想要访问,必须等待锁被释放,排队争抢。

简单说:互斥锁给共享资源上了一把「唯一钥匙」,谁拿到钥匙谁能用,其他人只能等,彻底杜绝多个线程同时操作共享资源导致的数据错乱。

✅ 互斥锁解决的核心痛点

线程的核心优势是「天然共享进程地址空间」(全局变量、堆内存、文件描述符等),但这也是最大的风险点:

  • • 无锁场景下,多个线程同时读写共享资源,会触发「竞态条件(Race Condition)」;
  • • 比如执行 count++(拆解为「读→加 1→写」3 步 CPU 指令),多线程并发时指令会互相插队,最终 count 值远小于预期;
  • • 更严重的会导致数据脏读、脏写、内存越界,甚至程序崩溃,且 bug 偶发、不可复现、调试难度极高。

互斥锁完美解决以上问题:通过「加锁→操作资源→解锁」的原子流程,把共享资源的读写逻辑变成「串行执行」,保证数据一致性。

✅ 互斥锁的底层执行逻辑

  1. 1. 加锁(lock):线程尝试获取锁,若锁未被占用,立即持有锁;若锁已被占用,线程进入「阻塞状态」,放弃 CPU 资源,等待锁释放;
  2. 2. 解锁(unlock):持有锁的线程释放锁,内核会从等待队列中唤醒「任意一个」等待该锁的线程,使其获得锁并继续执行;
  3. 3. 核心特性:锁的「加 / 解」操作是原子操作(CPU 指令级),不会被其他线程打断,这是互斥锁线程安全的根本保障。

二、pthread 互斥锁 核心使用场景

互斥锁是线程同步的「基础中的基础」,所有场景都围绕「保护共享资源」展开,覆盖 Linux 应用层开发 99% 的并发场景,无任何技术能替代其核心价值,按使用频率排序如下:

✅ 场景 1:保护全局变量 / 堆内存(最核心场景,占比 80%)

  • • 业务逻辑:多个线程读写同一个全局变量(如计数器、状态标志位、配置参数)或堆内存(如动态数组、缓冲区);
  • • 同步需求:保证读写操作的原子性,避免数据错乱;
  • • 典型案例:服务器的在线用户数计数器、嵌入式设备的传感器数据缓冲区、多线程的任务状态标志位。

✅ 场景 2:保护文件 / 设备 / 网络资源(高频场景)

  • • 业务逻辑:多个线程操作同一个文件(如日志写入)、硬件设备(如串口 / USB)、网络资源(如 socket、管道);
  • • 同步需求:避免多个线程同时写入导致内容重叠,或同时操作硬件导致设备异常;
  • • 典型案例:多线程日志系统、嵌入式多线程串口数据收发、服务器多线程 socket 读写。

✅ 场景 3:多锁嵌套保护独立共享资源(进阶场景)

  • • 业务逻辑:程序中有多个独立的共享资源(如 A 缓冲区、B 计数器),需要分别保护,避免一把锁导致全串行;
  • • 同步需求:不同资源用不同锁,最大化并发性能;
  • • 核心原则:严格遵守「加锁顺序统一」,避免死锁;
  • • 典型案例:电商系统的「库存计数器 + 订单计数器」、嵌入式设备的「传感器 A 数据 + 传感器 B 数据」。

✅ 场景 4:非阻塞 / 超时加锁(生产级场景)

  • • 业务逻辑:线程不能永久阻塞等待锁(如实时系统、超时任务),超过指定时间需执行兜底逻辑;
  • • 实现方式:用pthread_mutex_trylock(非阻塞)或pthread_mutex_timedlock(超时阻塞);
  • • 典型案例:工业控制的实时任务、服务器的超时请求处理、嵌入式低功耗设备的锁竞争处理。

✅ 场景 5:配合条件变量 / 读写锁使用(组合场景)

  • • 业务逻辑:条件变量需要互斥锁保护「条件判断变量」,读写锁需要互斥锁保证写操作的排他性;
  • • 核心价值:互斥锁是「基础同步组件」,几乎所有高级同步机制都依赖它;
  • • 典型案例:生产者 - 消费者模型(条件变量 + 互斥锁)、高并发读场景(读写锁 + 互斥锁)。

三、pthread 互斥锁 核心接口

互斥锁的接口全部在 <pthread.h> 头文件中,编译时必须加 -lpthread 链接线程库,接口数量少、逻辑简单,所有接口返回值:成功返回 0,失败返回错误码(非 errno,需手动处理)

✅ 1. 互斥锁的初始化(2 种方式,按需选择)

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

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • • 特点:一行完成初始化,无需手动销毁也不会内存泄漏,最简单高效,开发中 90% 场景用此方式;
  • • 适用:全局互斥锁、静态变量互斥锁。

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

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
  • • 参数 1 mutex:待初始化的互斥锁地址;
  • • 参数 2 attr:互斥锁属性(如锁类型、优先级继承等),传NULL使用默认属性即可;
  • • 配套操作:动态初始化的互斥锁,使用完毕必须调用pthread_mutex_destroy销毁!

✅ 2. 互斥锁的销毁(对应动态初始化)

int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • • 作用:释放互斥锁占用的内核资源,避免内存泄漏;
  • • 注意:① 静态初始化的互斥锁无需调用;② 锁被持有期间不能销毁(会返回 EBUSY 错误)。

✅ 3. 加锁(3 种方式,核心接口)

接口①:阻塞加锁(最常用)

int pthread_mutex_lock(pthread_mutex_t *mutex);
  • • 逻辑:锁空闲→立即持有;锁被占用→阻塞等待,直到拿到锁;
  • • 适用:绝大多数场景,简单直接。

接口②:非阻塞加锁(进阶)

int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • • 逻辑:锁空闲→立即持有,返回 0;锁被占用→不阻塞,直接返回 EBUSY 错误;
  • • 适用:不想线程阻塞的场景(如轮询操作、超时控制)。

接口③:超时阻塞加锁(生产级必备)

int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
  • • 逻辑:锁空闲→立即持有;锁被占用→阻塞等待,但超过指定时间后自动返回;
  • • 参数 2 abstime绝对时间(秒 + 纳秒),不是相对超时;
  • • 返回值:超时返回 ETIMEDOUT,成功返回 0;
  • • 核心价值:避免线程永久阻塞,防死锁必备。

✅ 4. 解锁(唯一接口)

int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • • 逻辑:释放持有的锁,唤醒等待队列中的一个线程;
  • • 强制规则:只有持有锁的线程才能解锁,未持有锁的线程解锁会返回 EPERM 错误,甚至触发程序崩溃。

四、pthread 互斥锁 核心对比(4 组高频对比,厘清技术边界)

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

二者是「互补关系」,不是替代关系,条件变量必须依赖互斥锁使用,核心差异如下:

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

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

✅ 对比 2:阻塞加锁 vs 非阻塞加锁 vs 超时加锁

三种加锁方式的核心差异,按需选择即可:

加锁方式
核心逻辑
优点
缺点
适用场景
pthread_mutex_lock
锁空闲则持有,否则阻塞
简单直接,适配 90% 场景
可能永久阻塞,有死锁风险
普通业务场景
pthread_mutex_trylock
锁空闲则持有,否则返回 EBUSY
不阻塞,避免死锁
需要轮询,代码稍复杂
实时任务、非阻塞场景
pthread_mutex_timedlock
阻塞等待,超时返回 ETIMEDOUT
防永久阻塞,生产级安全
需要设置绝对时间
生产环境所有核心场景

✅ 选型原则:测试环境用阻塞加锁,生产环境用超时加锁,实时场景用非阻塞加锁

✅ 对比 3:互斥锁 vs 自旋锁(pthread_spinlock_t)

自旋锁是「忙等锁」,和互斥锁的核心差异在「阻塞方式」:

特性
互斥锁
自旋锁
阻塞方式
放弃 CPU,进入休眠态
不放弃 CPU,循环抢锁
CPU 利用率
低(等待时不占用)
高(等待时 100% 占用)
切换开销
有(内核态 / 用户态切换)
无(纯用户态)
适用场景
锁持有时间长(>10ms)
锁持有时间短(<1ms)

✅ 选型原则:大部分场景用互斥锁,极短时间的锁竞争用自旋锁

✅ 对比 4:互斥锁 vs 读写锁(pthread_rwlock_t)

读写锁是「读写分离锁」,针对「多读少写」场景优化:

特性
互斥锁
读写锁
访问规则
任何时候只有一个线程访问
多读共享,单写排他
并发性能
低(全串行)
高(读场景并行)
实现复杂度
简单
复杂
适用场景
读写均衡、写多读少
多读少写(如配置读取)

✅ 选型原则:读写均衡用互斥锁,多读少写用读写锁

五、pthread 互斥锁 3 个可运行实战示例

代码才是硬道理。具3个常用 的示例

示例 1:基础银行转账(防止竞争)

这是最经典的用法。如果不加锁,两个线程同时改余额,最后钱肯定对不上。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>int balance = 1000;pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;void* withdraw(void *arg) {    int amount = *(int*)arg;    pthread_mutex_lock(&lock); // 1. 加锁    int temp = balance;    temp -= amount;    usleep(1000); // 模拟处理耗时,如果不加锁,这里肯定会乱    balance = temp;    printf("取款 %d, 剩余余额: %d\n", amount, balance);    pthread_mutex_unlock(&lock); // 2. 解锁    return NULL;}int main() {    pthread_t t1, t2;    int a1 = 200, a2 = 300;    pthread_create(&t1, NULL, withdraw, &a1);    pthread_create(&t2, NULL, withdraw, &a2);    pthread_join(t1, NULL);    pthread_join(t2, NULL);    printf("最终余额: %d (应该是 500)\n", balance);    return 0;}
如果不加锁,运行结果
如果加锁,运行结果

示例 2:多把锁的顺序(防止死锁)

死锁是线程编程的大坑。这个例子展示了“固定加锁顺序”这一黄金法则。

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;// 线程1:先锁 A,再锁 Bvoid* worker1(void *arg) {    printf("[线程1] 准备拿锁 A...\n");    pthread_mutex_lock(&lock_a);    printf("[线程1] 拿到锁 A,干活中...\n");    sleep(1);    printf("[线程1] 准备拿锁 B...\n");    pthread_mutex_lock(&lock_b); // 如果这里乱序去抢别的锁,可能死锁    printf("[线程1] 拿到锁 B,干活中...\n");    sleep(1);    pthread_mutex_unlock(&lock_b);    pthread_mutex_unlock(&lock_a);    printf("[线程1] 完工\n");    return NULL;}// 线程2:也先锁 A,再锁 B (顺序一致,安全!)void* worker2(void *arg) {    printf("[线程2] 准备拿锁 A...\n");    pthread_mutex_lock(&lock_a);     printf("[线程2] 拿到锁 A,干活中...\n");    sleep(1);    printf("[线程2] 准备拿锁 B...\n");    pthread_mutex_lock(&lock_b);     printf("[线程2] 拿到锁 B,干活中...\n");    sleep(1);    pthread_mutex_unlock(&lock_b);    pthread_mutex_unlock(&lock_a);    printf("[线程2] 完工\n");    return NULL;}int main() {    pthread_t t1, t2;    pthread_create(&t1, NULL, worker1, NULL);    pthread_create(&t2, NULL, worker2, NULL);    pthread_join(t1, NULL);    pthread_join(t2, NULL);    printf("所有线程安全退出,无死锁\n");    return 0;}
运行结果如下

示例 3:生产级版 — 超时加锁 + 非阻塞加锁(防卡死核心模板)

实现「超时阻塞加锁」和「非阻塞加锁」,覆盖生产环境防卡死需求:

  1. 1. 线程 1 用pthread_mutex_timedlock设置 3 秒超时,超时后执行兜底逻辑;
  2. 2. 线程 2 用pthread_mutex_trylock非阻塞加锁,锁被占用时直接跳过;
  3. 3. 严格遵守加解锁成对规则,无任何死锁风险。

完整代码

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>#include <time.h>#include <errno.h>pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;int g_data = 0;// 线程1:超时加锁(3秒超时)void* thread_timeout(void* arg){    struct timespec ts;    // 获取当前绝对时间 + 3秒超时    clock_gettime(CLOCK_REALTIME, &ts);    ts.tv_sec += 3;    printf("线程1:尝试加锁(超时3秒)...\n");    int ret = pthread_mutex_timedlock(&g_mutex, &ts);    if(ret == 0)    {        // 加锁成功        g_data = 100;        printf("线程1:加锁成功,设置data=%d\n", g_data);        sleep(5); // 持有锁5秒        pthread_mutex_unlock(&g_mutex);        printf("线程1:解锁完成\n");    }    else if(ret == ETIMEDOUT)    {        // 超时        printf("线程1:加锁超时(3秒),执行兜底逻辑\n");    }    else    {        printf("线程1:加锁失败,错误码=%d\n", ret);    }    return NULL;}// 线程2:非阻塞加锁void* thread_trylock(void* arg){    for(int i=0; i<10; i++)    {        int ret = pthread_mutex_trylock(&g_mutex);        if(ret == 0)        {            // 加锁成功            g_data += 10;            printf("线程2:加锁成功,data=%d\n", g_data);            pthread_mutex_unlock(&g_mutex);            break;        }        else if(ret == EBUSY)        {            // 锁被占用            printf("线程2:锁被占用,跳过本次(第%d次尝试)\n", i+1);            sleep(1);        }    }    return NULL;}int main(){    pthread_t tid1, tid2;    pthread_create(&tid1, NULL, thread_timeout, NULL);    sleep(1); // 让线程1先尝试加锁    pthread_create(&tid2, NULL, thread_trylock, NULL);    pthread_join(tid1, NULL);    pthread_join(tid2, NULL);    pthread_mutex_destroy(&g_mutex);    printf("主线程:最终data=%d\n", g_data);    return 0;}

运行结果

超时加锁避免线程永久阻塞,是生产环境防卡死的核心方案;非阻塞加锁适合「不希望线程等待」的场景,如实时任务。

七、pthread 互斥锁 的优缺点(客观全面,选型参考)

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

  1. 1. 简单易用:接口少、逻辑清晰,新手 1 小时即可掌握核心用法,开发成本极低;
  2. 2. 线程安全:加解锁是原子操作,内核级保障,能彻底解决竞态条件问题;
  3. 3. 通用性强:适配所有共享资源保护场景,是线程同步的「通用解决方案」;
  4. 4. 低开销:用户态实现为主,内核态切换开销极小,性能接近理论最优;
  5. 5. 灵活可控:支持阻塞 / 非阻塞 / 超时三种加锁方式,适配所有业务场景;
  6. 6. 生态完善:是条件变量、读写锁等高级同步机制的基础,兼容性无死角。

✅ 缺点(局限性,客观认知)

  1. 1. 只能实现互斥,无法直接控制执行顺序:需配合条件变量才能实现线程有序执行;
  2. 2. 存在死锁风险:多锁嵌套时若顺序不一致,极易触发死锁;
  3. 3. 大粒度锁会降低并发性能:锁粒度太大导致多线程串行,失去并发优势;
  4. 4. 阻塞时放弃 CPU:相比自旋锁,短时间锁竞争的切换开销稍高;
  5. 5. 无法区分读写操作:多读少写场景下,并发性能不如读写锁。

✅ 优缺点总结

✔️ 互斥锁的优点是压倒性的:简单、安全、通用,是线程同步的「基石」,没有任何技术能替代;

✔️ 互斥锁的缺点都是可规避的:通过规范编码(如统一加锁顺序、减小锁粒度)、配合其他同步机制(如条件变量),能轻松解决所有局限性;

✔️ 结论:互斥锁是 Linux 线程开发「必学、必会、必用」的核心技术,没有之一。

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

  1. 1. 互斥锁的核心是「排他性访问」,加解锁必须成对、同线程执行,锁粒度越小越好;
  2. 2. 防死锁黄金法则:多锁嵌套统一加锁顺序,持有锁不调用阻塞接口,生产环境用超时加锁
  3. 3. 核心接口:初始化→加锁(阻塞 / 非阻塞 / 超时)→解锁→销毁,逻辑简单,固定范式;
  4. 4. 最核心场景是保护全局变量 / 堆内存,其次是文件 / 设备资源、多锁嵌套、超时加锁;
  5. 5. 互斥锁是基础,配合条件变量可实现有序执行,配合读写锁可优化多读场景性能;
  6. 6. 优点是简单通用、线程安全,缺点是有死锁风险、无法直接控制执行顺序,整体瑕不掩瑜。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 12:18:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/472842.html
  2. 运行时间 : 0.141068s [ 吞吐率:7.09req/s ] 内存消耗:4,750.00kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7bd2e8b95bf99ace5a65f0a88f791e5b
  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.000951s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000803s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003766s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.007045s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000687s ]
  6. SELECT * FROM `set` [ RunTime:0.002322s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000762s ]
  8. SELECT * FROM `article` WHERE `id` = 472842 LIMIT 1 [ RunTime:0.002546s ]
  9. UPDATE `article` SET `lasttime` = 1770437883 WHERE `id` = 472842 [ RunTime:0.006798s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.002253s ]
  11. SELECT * FROM `article` WHERE `id` < 472842 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001319s ]
  12. SELECT * FROM `article` WHERE `id` > 472842 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004704s ]
  13. SELECT * FROM `article` WHERE `id` < 472842 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.010431s ]
  14. SELECT * FROM `article` WHERE `id` < 472842 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.020866s ]
  15. SELECT * FROM `article` WHERE `id` < 472842 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008430s ]
0.142764s