определение переменных для семафора - PullRequest
0 голосов
/ 23 мая 2018

У меня два вопроса:

  1. сумма переменных и счетчик в этом коде определены как long long ?Я изменил их на int, но это не дало мне подобного подсчета, как коды без потоков и семафоров!Почему count получает полуслучайные значения (даже если снова установить его в ноль для цикла)?
  2. Как я могу достичь 1 + 2 + 3 ... / 10?Я имею в виду, как влияет тип переменных (не связанных с семафором, процессом и потоками. То есть pid_t)?

Заранее спасибо.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <semaphore.h>
sem_t s1;
char running = 1;
long long counter = 0;
void * process() {
  while (running) {
    sem_wait(&s1);
    counter++;
    sem_post(&s1);
  }
  printf("Thread: exit\n");
  pthread_exit(NULL);
}

int main() {
  int i;
  long long sum = 0;
  pthread_t thread_Id;
  sem_init(&s1, 0, 1);
  if (pthread_create(&thread_Id, NULL, process, NULL)) {
    printf("ERROR in pthread_create()\n");
    exit(-1);
  }

  for (i=0 ; i < 10 ; i++) {
    sleep(1);
    sem_wait(&s1);
    printf("counter = %lld\n", counter);
    sum += counter;
    counter = 0;
    sem_post(&s1);
  }

  sem_wait(&s1);
  running = 0;
  sem_post(&s1);
  pthread_join(thread_Id, NULL);
  printf("Average Instructions = %lld \n", sum/10);

  return 0;

}

1 Ответ

0 голосов
/ 23 мая 2018

1. сумма переменных и счетчик в этом коде определены как long long?Я изменил их на int, но это не дало мне аналогичного подсчета,

Не уверен, что вы подразумеваете под этим.Изменение int на long long для counter и sum (и корректировка спецификатора форматирования % в соответствии, например, с %d) не должны (значимо) изменять смысл программы.В x86_64 Linux вы будете использовать 32-битный счетчик вместо 64-битного.

как коды без потоков и семафоров!

Ну,нам нужно было бы увидеть другую программу, но см. ниже.

почему count получает полуслучайные значения (даже если снова установить его в нулевой цикл)?

Потому что запущены два параллельных потока.Один увеличивает счетчик, а второй сбрасывает его каждую секунду.Невозможно предсказать, сколько раз другой поток сможет увеличить счетчик.Это будет зависеть от нагрузки системы (между запусками на одном и том же компьютере) и от самой системы (между машинами, то есть от того, насколько она быстра).

Как правило, это единственный тип системы, в котором значение счетчикаможно было бы «прогнозировать», что это будет процессор без фиксированной частоты, процессор с фиксированной частотой и детерминированный планировщик / операционная система и т. д. Обычный рабочий стол не является такой машиной - полная противоположность, на самом деле!

Я бы посоветовал почитать об операционных системах, их планировщике, таймлайзинге и т. Д.

...