【发布时间】:2013-09-05 13:48:39
【问题描述】:
如果我想在函数中运行一段代码,只能从函数的第二次调用开始,
问题:
这样做有什么问题吗?
我怎样才能做到这一点?使用静态变量来做这件事是个好主意吗?
【问题讨论】:
-
一个普通的静态是好的,除非你的函数是从多个线程调用的。
标签: c++ function static invocation
如果我想在函数中运行一段代码,只能从函数的第二次调用开始,
问题:
这样做有什么问题吗?
我怎样才能做到这一点?使用静态变量来做这件事是个好主意吗?
【问题讨论】:
标签: c++ function static invocation
这个问题有两个答案,取决于你是否必须处理多线程序列化。
无线程:
void doSomething() {
static bool firstTime = true;
if (firstTime) {
// do code specific to first pass
firstTime = false;
} else {
// do code specific to 2nd+ pass
}
// do any code that is common
}
使用线程: 我将编写通用样板,但此代码是特定于系统的(需要原子 compareAndSet 的一些变体)。
void doSomethingThreadSafe() {
static volatile atomic<int> passState = 0;
do {
if ( passState == 2 ) {
//perform pass 2+ code
break;
} else
if ( passState.compareAndSet(0,1) ) { // if passState==0 set passState=1 return true else return false
//perform pass 1 initialization code
passState = 2;
break;
} else {
//loser in setup collision, delay (wait for init code to finish) then retry
sleep(1);
}
} while(1);
//perform code common to all passes
}
【讨论】:
多线程将是一个问题。为了防止这种情况,如果需要,您可能需要mutex 之类的东西。
像这样:
void someFunction()
{
static bool firstRun = true;
if (!firstRun)
{
// code to execute from the second time onwards
}
else
{
firstRun = false;
}
// other code
}
【讨论】:
添加一个全局计数器。 例如:-
静态整数计数器 = 0;
public void testFunc(){
if(counter==1){
........
<Execute the functionality>
........
}
counter++;
}
【讨论】:
static 变量。哦,这个问题被标记为 C++。