Как периодически инициализировать переменную в c

Я пытаюсь реализовать некоторое время ( 1 ) { если ( / * 5 секунд закончились, повторите инициализацию токенов с помощью 10 * / ) / * Инициализируйте переменную * / токен = 10 ; / * токены - токен 5 * / else -; } bucket algo, где я хочу инициализировать мои токены каждый раз за каждые х секунд с помощью t-токенов. Скажем, каждые 5 секунд я хочу инициализировать токены с 10. Если прошло 5 секунд, повторите инициализацию моих жетонов с помощью 10.

  uint32_t token;
  time_t tokenInitialization;
  time_t check;
  token = 10;
  time(&tokenInitialization);
  while (1)
  {
    Sleep(1000);
    time(&check);
    if (difftime(check,tokenInitialization) >= 5)
    {
      printf("reinitializing.. %d
",token);
      time(&tokenInitialization);
      /* 5 seconds are over, reinitialize the tokens with 10 */
      /* Initialize a variable */
      token = 10;   /*  tokens are 5 */
    }
    else
      token--;
  }

Как я могу это достичь?

c,

0

Ответов: 3


0

предполагая, что вы находитесь в окнах, вы можете рассмотреть такое решение:

#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void reset_token(int);
int token;

int main () {
    // Sets SIGALARM to be delivered to this process in 5 seconds
    alarm(5);

    // Sets our reset_token to be called each time
    // a SIGALARM is received
    signal(SIGALARM, reset_token);

    token=10;

    while(1) {
        token--;
    }

    return(0);
}

void reset_token(int signum) {
    // This function is called every time this process
    // receives a SIGALARM. We reset the token here.

    token=10;

    // Sets SIGALARM to be delivered again in 5 seconds
    alarm(5);
}

0

В системе unix вы можете использовать систему сигнализации. В этом примере кода токен является глобальной переменной. Для переносимости заслуживают внимания решения, которые используют функции для получения времени. Я показываю здесь возможное решение с механизмом тревоги.

volatile sig_atomic_t

0

Это конкретная операционная система. Если вы работаете без ОС, это зависит от платформы и оборудования.

Для Linux и POSIX

Для Linux также читайте время (7) и подумайте, возможно, timer_create (2) и связанные функции. Тревога (2) - старомодная (и имеет единовременную гранулярность, другие системные вызовы позволяют значительно уменьшить интервалы таймера, возможно, менее миллисекунды).

Не используйте циклы ожидания занятости: они запускают циклы процессора бесполезно (поэтому потребляйте электроэнергию и нагревайте процессор и сосать батарею вашего ноутбука). Используйте некоторый цикл ожидания для ожидания. Вы можете использовать опрос (2) в каком-либо цикле событий или использовать паузу (2) , нанослое (2) и т. Д. ...

Обязательно прочитайте сигнал (7) и безопасность сигнала (7) . Если у вас есть обработчик сигналов, установите token в него некоторый флаг, который вы проверите в другом месте.


Читайте об изменчивых переменных . Вам наверняка нужно использовать некоторые (даже на других платформах). Скорее всего, ваша tokenпеременная должна быть volatile. С C11 рассмотрим, возможно, и атомные операции .


Вы также можете рассмотреть несколько многопотоковых подходов. Прочтите несколько уроков Pthread и заботитесь о синхронизации , атомарности , ACID -ity, мьютексах , семафорах .

с,
Похожие вопросы
Яндекс.Метрика