定义信号量的变量

时间:2018-05-23 07:32:58

标签: c multithreading pthreads semaphore

我有两个问题:

  1. 此代码中的变量sum和counter定义为 长久?我将它们改为int,但它没有给我类似的计数,就像没有线程和信号量的代码一样!为什么count会得到半随机值(即使再次将for循环设置为零)?
  2. 如何达到1 + 2 + 3 ... / 10?我的意思是,什么是类型的影响 变量(那些与信号量,进程和线程无关的变量。即pid_t)?
  3. 提前谢谢你。

    #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 :(得分:1)

  

1.此代码中的变量sum和counter被定义为long long?我将它们改为int,但它没有给我类似的计数,

不确定你的意思。将intlong long的{​​{1}}更改为counter(并相应地调整sum格式说明符,例如%)不应该(有意义)改变程序的含义。在x86_64 Linux中,您将使用32位计数器,而不是64位计数器。

  

就像没有线程和信号量的代码一样!

好吧,我们需要查看其他程序,但请参见下文。

  

为什么count得到半随机值(即使再次在for循环中将其设置为零)?

因为有两个并发线程在运行。一个是递增计数器,另一个是每秒重置一次。无法预测其他线程能够递增计数器的次数。它将取决于系统的负载(在同一台机器中运行之间)和系统本身(机器之间,即它的速度)。

通常,唯一一种计数器值可以预测的系统#34;将是一个非OOO,固定频率处理器与确定性调度/操作系统等。一个普通的桌面不是这样的机器 - 事实上完全相反!

我建议您阅读操作系统,调度程序,时间限制等。