【问题标题】:Execute a piece of code in a function from the second invocation onwards从第二次调用开始执行函数中的一段代码
【发布时间】:2013-09-05 13:48:39
【问题描述】:

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

问题:

  1. 这样做有什么问题吗?

  2. 我怎样才能做到这一点?使用静态变量来做这件事是个好主意吗?

【问题讨论】:

  • 一个普通的静态是好的,除非你的函数是从多个线程调用的。

标签: c++ function static invocation


【解决方案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. 多线程将是一个问题。为了防止这种情况,如果需要,您可能需要mutex 之类的东西。

    2. 像这样:

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

    【讨论】:

    • 移动'firstRun = false;'进入条件以节省少量 CPU 时间。 (编辑:我的意思是作为其他部分)
    • 对不起,我不是很清楚,我的意思是其他。这样它只会运行第一遍。
    • @Speed8ump 好的,很酷。是的,这可能会稍微好一些(虽然我会说是为了可读性)。
    【解决方案3】:

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

    静态整数计数器 = 0;

    public void testFunc(){
    
        if(counter==1){
    
           ........
           <Execute the functionality>
           ........
    
         }
        counter++;
    
    }
    

    【讨论】:

    • 这不是唯一的方法,而且它会将柜台留给其他人篡改。计数器可以是函数内的static 变量。哦,这个问题被标记为 C++。
    • 然后用 c++ 的方式来做 :)
    • 这在很多方面都是错误的:1)公开的声音? 2) 不处理多线程问题,3) 仅在第二次调用时执行,这不是 OP 的请求,4) 计数器最终会翻转,5) 为什么将计数器初始化为 1 而不是 0?初始化为 1 很难说它在计数。 6) 用“counter”之类的名字污染全局命名空间是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2021-04-21
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多