Выполнить часть кода в функции начиная со второго вызова

Если я хочу запустить фрагмент кода в функции, только начиная со второго вызова функции,

Вопросы:

  1. Что-то не так, чтобы сделать это?

  2. Как я могу достичь этого? Является ли использование статической переменной для этого хорошей идеей?

0

Решение

Есть два ответа на этот вопрос, в зависимости от того, приходится ли вам иметь дело с многопоточной сериализацией или нет.

Нет потоков:

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
}

С резьбой:
Я напишу общий шаблон, но этот код зависит от системы (требует некоторого варианта атомарного сравнения AndSet).

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
}
1

Другие решения

  1. Многопоточность будет проблемой. Чтобы предотвратить это, при необходимости вам, вероятно, понадобится что-то вроде мьютекс.

  2. Как это:

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

Добавьте глобальный счетчик.
например:-

статический int counter = 0;

public void testFunc(){

if(counter==1){

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

}
counter++;

}
-1
По вопросам рекламы [email protected]