从第二次调用开始执行函数中的一段代码

时间:2013-09-05 13:48:39

标签: c++ function static invocation

如果我想在函数中运行一段代码,只能从函数的第二次调用开始,

问题:

  1. 这样做有什么不对吗?

  2. 我怎么可能实现这个目标?使用静态变量来做这个好主意吗?

3 个答案:

答案 0 :(得分:1)

  1. 多线程将是一个问题。为了防止这种情况发生,如果需要,您可能需要mutex

  2. 喜欢这样:

    void someFunction()
    {
       static bool firstRun = true;
       if (!firstRun)
       {
          // code to execute from the second time onwards
       }
       else
       {
          firstRun = false;
       }
       // other code
    }
    

答案 1 :(得分:1)

这个问题有两个答案,取决于你是否需要处理多线程序列化。

没有线程:

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
}

答案 2 :(得分:-1)

添加全局计数器。 例如: -

static int counter = 0;

public void testFunc(){

    if(counter==1){

       ........
       <Execute the functionality>
       ........

     }
    counter++;

}