我已经写了很多年的C代码,但最近遇到了一个我从未使用过的特性:函数内的静态变量。因此,我想知道你们有哪些使用这个特性的方法,并且这样做是正确的设计决策。
例如:
int count(){
static int n;
n = n + 1;
return n;
}
这是一个糟糕的设计决策。为什么呢?因为后来你可能想要减少计数,这将涉及更改函数参数、更改所有调用代码等操作...
希望这已经足够清楚了,谢谢!
我已经写了很多年的C代码,但最近遇到了一个我从未使用过的特性:函数内的静态变量。因此,我想知道你们有哪些使用这个特性的方法,并且这样做是正确的设计决策。
例如:
int count(){
static int n;
n = n + 1;
return n;
}
这是一个糟糕的设计决策。为什么呢?因为后来你可能想要减少计数,这将涉及更改函数参数、更改所有调用代码等操作...
希望这已经足够清楚了,谢谢!
void first_call()
{
static int n = 0;
if(!n) {
/* do stuff here only on first call */
n++;
}
/* other stuff here */
}
我曾在测试代码中使用静态变量进行延迟状态初始化。但在生产代码中使用静态局部变量会充满风险,可能导致微妙的错误。至少在我通常处理的代码中,几乎任何一段最初只能单线程运行的代码都有最终成为并发情况下工作的危险。在并发环境中使用静态变量可能会导致难以调试的问题,因为状态改变实际上是隐藏的副作用。
我已经使用静态变量来控制另一个线程的执行。
例如,线程#1(主线程)首先声明和初始化一个控制变量,如下:
/* on thread #1 */
static bool run_thread = true;
// then initialize the worker thread
然后它开始执行线程#2,直到线程#1决定停止它之前,线程#2将执行一些工作:
/* thread #2 */
while (run_thread)
{
// work until thread #1 stops me
}
pthread_mutex
的东西来确保一致的读写。 - Justin Spahr-Summers_Atomic
类型获得特殊保证之外,唯一可移植的方法是使用pthread_mutex_*
函数来获取必要的内存屏障。 - R.. GitHub STOP HELPING ICE有一个非常突出的例子,你非常需要使用static
来保护关键部分,即互斥锁。以POSIX线程为例:
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mut);
/* critical code comes here */
pthread_mutex_unlock(&mut);
使用 auto
变量无法实现此功能。
POSIX 为互斥锁、条件变量和一次性变量提供了这样的 static
初始化器。
pthread_once
接口以线程安全的方式提供了等效的功能。 即使调用初始化函数的线程在初始化完成之前被取消,它也是安全的。(而且没有理由不在单线程程序中使用pthread_once
,这些程序从未期望使用线程。) - R.. GitHub STOP HELPING ICE