当前位置:首页>Linux>linux系统编程(二):mutex与atomic实战指南

linux系统编程(二):mutex与atomic实战指南

  • 2026-07-02 16:30:28
linux系统编程(二):mutex与atomic实战指南

mutex 和 atomic 怎么选 —— 从原理到实战

多线程读写同一个变量,几乎所有 bug 都来源于"以为它原子,其实不是"。这篇用一个简单的"1 亿次 +1"实测,把 mutex 和 atomic 的差异、性能、底层机制一次讲清楚。


0. 一个实验

让 4 个线程各自 +1 一亿次,预期最终 counter = 4 亿

三种写法

写法 A:裸 int

int counter = 0;void *worker(void *arg){    for (int i = 0; i < 100000000; i++) counter++;    return NULL;}

实测结果:约 1 ~ 3 亿(每次都不一样,远小于 4 亿)。

写法 B:mutex 保护

int counter = 0;pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;void *worker(void *arg){    for (int i = 0; i < 100000000; i++) {        pthread_mutex_lock(&m);        counter++;        pthread_mutex_unlock(&m);    }    return NULL;}

实测结果:4 亿(正确),耗时约 30 秒

写法 C:atomic

#include<stdatomic.h>atomic_int counter = 0;void *worker(void *arg){    for (int i = 0; i < 100000000; i++) {        atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed);    }    return NULL;}

实测结果:4 亿(正确),耗时约 3 秒

为什么裸 int 错?为什么 atomic 比 mutex 快 10 倍?下面拆解。


1. 为什么裸 int 会丢数据?

counter++ 在汇编层不是一条指令,是三步:

load  counter -> r0    (Read)add   r0, 1            (Modify)store r0 -> counter    (Write)

两个线程并发执行时,三步可以任意交错:

最终 counter = 11,而不是 12 —— 丢失了一次更新。这就是 data race:多线程并发读写同一变量、又没有任何同步原语保护。

按 C11 标准,data race 是未定义行为(UB)。编译器/CPU 有权做任何优化,包括:

  • 把这个变量优化成寄存器常量(永远不从内存读)
  • 跨越循环边界 reorder
  • 直接合并多次读写

所以"裸 int 实测能跑出某个值"完全靠运气,改一下编译选项、换一个 CPU、加一个 LTO,行为就可能完全变


2. mutex:用"锁"串行化访问

2.1 基础用法

#include<pthread.h>// 静态初始化(最方便)pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;// 或动态初始化pthread_mutex_t m;pthread_mutex_init(&m, NULL);// 加锁 / 解锁 / 销毁pthread_mutex_lock(&m);counter++;pthread_mutex_unlock(&m);pthread_mutex_destroy(&m);  // 必须在没人用了之后

2.2 trylock / timedlock

intpthread_mutex_trylock(pthread_mutex_t *m);// 拿不到锁立即返回 EBUSY,不阻塞intpthread_mutex_timedlock(pthread_mutex_t *m, conststruct timespec *abstime);// 拿不到锁等到 abstime 时刻

适用场景:

  • trylock
    :避免阻塞主线程的兜底逻辑
  • timedlock
    :带超时的临界区(防死锁兜底)

2.3 mutex 底层:futex 双路径

Linux 上的 pthread_mutex 基于 futex (Fast Userspace muTEX) 实现。设计哲学:99% 的锁都是无竞争的,能在用户态搞定就别进内核。

伪代码:

struct mutex {    int state;   // 0 = 空闲;1 = 有人持有;2 = 有人持有 + 有等待者};void lock(mutex *m) {    /* ① fast path:无竞争 → 用户态 CAS,约 30-60 ns */    if (atomic_compare_exchange(&m->state01)) return;    /* ② slow path:有人持有 → 进内核排队,约 1-10 μs */    while (atomic_exchange(&m->state2) != 0) {        syscall(SYS_futex, &m->state, FUTEX_WAIT, 2);    }}void unlock(mutex *m) {    int prev = atomic_exchange(&m->state0);    if (prev == 2) {        /* 有人在等 → syscall 唤醒 */        syscall(SYS_futex, &m->state, FUTEX_WAKE, 1);    }}

2.4 mutex 性能数据

典型 ARM64 / x86-64 实测:

场景
耗时
无竞争 lock + unlock
30 ~ 60 ns
(纯用户态 CAS)
有竞争(进内核等)
1 ~ 10 μs
阻塞被唤醒一轮
10 ~ 100 μs

fast path 没有 syscall,开销跟普通函数调用差不多。慢的是 slow path —— 一旦进内核就跨越了用户态/内核态切换 + 调度。

2.5 mutex 的常见坑

  1. 忘记 unlock:所有路径(包括异常 / 提前 return)都要解锁。C++ 用 RAII / std::lock_guard,C 靠纪律 + cleanup_push。

  2. 递归锁:默认 mutex 不允许同一线程 lock 两次(死锁)。需要时用:

    pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
  3. 死锁:A 持锁 1 等锁 2,B 持锁 2 等锁 1。规避:固定加锁顺序 + 分级锁。

  4. 锁粒度:临界区太大 → 并发度低;太小 → 可能数据不一致。粒度选择没标准答案,看场景。

  5. destroy 时还有人持锁:UB。destroy 必须在所有线程退出 / 不再使用之后。


3. atomic:硬件级原子操作

3.1 基础类型和操作

C11 <stdatomic.h>

#include<stdatomic.h>atomic_int counter;atomic_init(&counter, 0);/* 原子加(RMW = Read-Modify-Write,单条指令完成) */atomic_fetch_add(&counter, 1);/* 简单读写 */int v = atomic_load(&counter);atomic_store(&counter, 0);/* CAS(compare-and-swap,原子条件写) */int expected = 10, desired = 20;atomic_compare_exchange_strong(&counter, &expected, desired);/* * 如果 *counter == expected:写入 desired,返回 true * 否则:把 *counter 实际值写回 expected,返回 false */

可用类型不止 atomic_int,还有 atomic_longatomic_boolatomic_uintptr_t_Atomic(struct foo *) 等。

3.2 底层:硬件原子指令

x86-64 上 atomic_fetch_add 编译成:

lock xadd %eax, (%rdi)

lock 前缀让这条指令变成原子操作,整个 cache line 在执行期间被独占。

ARM64 上没有 lock 前缀,而是用 LL/SC(Load-Linked / Store-Conditional):

1: ldxr  w0, [x1]       ; load-exclusive,标记这块内存   add   w0, w0, #1   stxr  w2, w0, [x1]   ; store-exclusive,期间被改过会失败   cbnz  w2, 1b         ; 失败重试

或者 ARM v8.1 后用 ldadd 一条指令完成。

无论哪种实现,整个 RMW 在硬件层不可被打断

3.3 memory_order:要多强的同步保证

atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed);

memory_order 选项:

选项
强度
适用
relaxed
最弱:只保证原子性,不保证跨变量顺序
计数器(不在乎相对顺序)
acquire
读屏障:之后的所有读必然看到对方 release 之前的写
标志位读
release
写屏障:之前的所有写在 store 完成时对其他线程可见
标志位写
acq_rel
acquire + release
RMW(既读又写)
seq_cst
全局总序
默认值,最严格但最慢

acquire / release 配对:建立 happens-before

最常用的同步模式:

/* 生产者线程 */data = 42;atomic_store_explicit(&ready, 1, memory_order_release);/* release 保证 data = 42 这个写在 store 之前完成 *//* 消费者线程 */while (atomic_load_explicit(&ready, memory_order_acquire) == 0)    /* spin */ ;/* acquire 保证读到 1 之后能看到 data = 42 */int x = data;   /* 一定是 42 */

如果没有 acquire / release,CPU 和编译器可以把指令前后重排,消费者可能读到 ready=1 但 data 还是旧值。


4. mutex vs atomic:怎么选

4.1 性能对比(呼应开头的实验)

ARM64 实测(4 线程 × 1 亿次 +1):

实现
耗时
单次操作
裸 int(错的)
~1.5 秒
~3.7 ns
atomic
~3 秒
~7.5 ns
mutex
~30 秒
~75 ns

atomic 比 mutex 快约 10 倍(无竞争场景)。竞争激烈时差距更大 —— mutex 可能进 syscall(~μs 级),atomic 只是自旋重试(~ns 级)。

4.2 选择决策树

4.3 atomic 单变量也救不了:经典反例

银行转账:从账户 A 减 100,账户 B 加 100。要保持"两账户总额恒定"。

atomic_int balance_a = 1000;atomic_int balance_b = 1000;void transfer(int amount) {    atomic_fetch_sub(&balance_a, amount);   /* ← 这里和下面之间有窗口期 */    /* 别的线程读 balance_a + balance_b 总和会少 amount */    atomic_fetch_add(&balance_b, amount);}

虽然两个变量各自是 atomic,但两步之间不是原子的。要让总和恒定,必须用 mutex 把两步包起来:

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;int balance_a = 1000, balance_b = 1000;voidtransfer(int amount){    pthread_mutex_lock(&m);    balance_a -= amount;    balance_b += amount;    pthread_mutex_unlock(&m);}

多变量协调 → mutex,没有捷径。

4.4 atomic 复合操作:用 CAS 循环造

如果 atomic 没提供你要的原语(比如"如果 x < 10 才 ++"),用 CAS 循环:

atomic_int x;boolincrement_if_small(void) {    int cur = atomic_load(&x);    while (cur < 10) {        /* 期望当前是 cur,写入 cur+1;         * 如果中途被改过,cur 会被自动更新成新值,重试 */        if (atomic_compare_exchange_weak(&x, &cur, cur + 1))            return true;    }    return false;}

这是 lock-free 数据结构的基础套路(无锁队列、无锁栈、引用计数等)。

4.5 双角度对比表

维度
atomic
mutex
互斥性
❌(多个线程能同时进入)
顺序性 / 可见性
阻塞
❌ 永不阻塞
⚠️ 可能阻塞
死锁风险
❌ 完全不可能
⚠️ 有
性能(无竞争)
⭐⭐⭐ ~10 ns
⭐⭐ ~50 ns
性能(有竞争)
⭐⭐⭐ 自旋等
⭐ 进内核 ~μs
单变量原子操作
✅ 完美
浪费
多变量协调
❌ 不够
复杂逻辑临界区
学习曲线
陡(memory_order)

经验法则

  • 计数器、标志位、单变量 → atomic
  • 多变量协调、复杂临界区 → mutex
  • 性能敏感 hot path 上的简单数据 → atomic
  • 不确定怎么选 → mutex(更安全,性能差一个数量级但绝大多数场景能接受)

5. 几个真正容易踩的坑

5.1 atomic 的 RMW 陷阱

看着像 atomic 其实不是:

atomic_int x;/* ⛔ 这是三步,不是原子的 */int v = atomic_load(&x);v++;atomic_store(&x, v);/* ✅ 这才是原子的 */atomic_fetch_add(&x, 1);

5.2 memory_order 选错

/* ⛔ 用 relaxed 做生产者-消费者同步,可能读到 data 旧值 */data = 42;atomic_store_explicit(&ready, 1, memory_order_relaxed);/* ✅ 必须用 release */data = 42;atomic_store_explicit(&ready, 1, memory_order_release);

不确定时用默认的 seq_cst(不写 explicit 后缀),代码更慢但绝对不会出错。

5.3 mutex 跨进程不能用 PTHREAD_MUTEX_INITIALIZER

PTHREAD_MUTEX_INITIALIZER 只在进程内有效。跨进程要:

pthread_mutexattr_t attr;pthread_mutexattr_init(&attr);pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);pthread_mutex_init(&m, &attr);   /* m 必须在共享内存里 */pthread_mutexattr_destroy(&attr);

5.4 析构忘记 destroy mutex

struct foo {    pthread_mutex_t lock;    ...};struct foo *f = malloc(sizeof(*f));pthread_mutex_init(&f->lock, NULL);/* 用完了... */pthread_mutex_destroy(&f->lock);   /* ✅ 必须在 free 之前 */free(f);

直接 free 不 destroy 在 Linux 上通常没问题(pthread_mutex 内部不分配额外资源),但严格来说是资源泄漏,valgrind 等工具会标记。

5.5 atomic_bool 不能用赋值

atomic_bool b;b = true;            /* ⛔ 不是 atomic 操作 */atomic_store(&b, true);  /* ✅ */

C11 规定"对 atomic 变量的所有访问必须通过 atomic_* 函数",直接 = 是 UB。


6. 一张图理清 mutex 和 atomic 的层级关系

mutex 和 atomic 都建立在 CPU 原子指令之上,但抽象层级不同

  • atomic
     是单点原子操作 —— 硬件指令直接保证
  • mutex
     是临界区互斥 —— 用 atomic CAS + 内核排队组合实现,包多条语句

它们解决的是同一类问题(共享内存的并发访问),但工具的颗粒度不同。


7. 收尾

写多线程代码的核心难点不在于"会不会用 lock",而在于先想清楚"要保护什么数据 / 什么不变量"。然后选工具:

  • 保护单变量的原子操作
     → atomic
  • 保护多个变量的某种关系
     → mutex
  • 保护一段代码逻辑
     → mutex

mutex 慢是为了让线程睡觉省 CPU;atomic 快是因为它不睡觉但占着 CPU 自旋重试。这是一个 trade-off,没有绝对的对错。

新手常犯的错是一上来就 mutex(性能浪费)或一上来就 atomic 自己造车(撞上多变量场景必须 mutex 的坑)。先想清楚要保护什么,再选工具,多线程代码 80% 的 bug 就避免了。

请在微信客户端打开

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 01:04:48 HTTP/2.0 GET : https://f.mffb.com.cn/a/502561.html
  2. 运行时间 : 0.170562s [ 吞吐率:5.86req/s ] 内存消耗:4,891.78kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=4d725a49b15db9e05d53e30de566848c
  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.000519s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000524s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000247s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000282s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000463s ]
  6. SELECT * FROM `set` [ RunTime:0.000202s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000830s ]
  8. SELECT * FROM `article` WHERE `id` = 502561 LIMIT 1 [ RunTime:0.007494s ]
  9. UPDATE `article` SET `lasttime` = 1783011888 WHERE `id` = 502561 [ RunTime:0.036384s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000447s ]
  11. SELECT * FROM `article` WHERE `id` < 502561 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001609s ]
  12. SELECT * FROM `article` WHERE `id` > 502561 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002197s ]
  13. SELECT * FROM `article` WHERE `id` < 502561 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.019787s ]
  14. SELECT * FROM `article` WHERE `id` < 502561 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001622s ]
  15. SELECT * FROM `article` WHERE `id` < 502561 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.028434s ]
0.172135s