Back to Blog

linux大量使用了static关键字用来修饰函数和结构体定义,为何?

#linux#语言#多线程#struct#c#2010

这样做的目的与前述函数、变量相同——限制作用域,防止其他文件误用或误改。

4. 多线程环境下的 static 数据

2.和LS的两位意思差不多,static可以减少函数的使用,也就起到了便于维护的作用(不用同时修改多处地方的代码)。但是这同样破坏了类的结构性,老板也一直不让我使用static的接口。
一直觉得C++是注重结构性的语言,虽然性能很重要,但是C++更注重接口的使用,以良好的设计带来良好的性能与易拓展性。这和C语言有些不同吧~

4.1 线程共享 vs. 线程私有

  • 共享数据:如果某个 static 变量需要在多个线程之间共享(例如计数器、状态标志),必须自行 加锁(spinlock、mutex)或使用 原子操作 来保证并发安全。内核中常见的做法是将该变量放在 struct 中,并通过 spin_lock() 系列函数保护访问。
  • 线程私有数据:如果变量仅在单个线程内部使用,通常不需要 static,而是放在 线程栈线程局部存储(TLS) 中。Linux 内核提供 current 指针指向当前进程/线程的 task_struct,可以在其中挂载私有数据,避免全局 static 带来的竞争。

4.2 static 与锁的配合

在内核代码里,static 变量常常配合锁一起出现,形成“内部状态 + 保护”模式。例如: