首页 > 解决方案 > 为什么我在运行多线程程序时得到不同的结果?

问题描述

我在做操作系统程序作业时遇到了一些麻烦。而且我想了很多时间都没有得到它。所以我希望有人能帮助我。非常感谢!这是我的代码。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#include "buffer.h"

// Global variables
buffer_item buffer[BUFFER_SIZE];
pthread_mutex_t mutex;
sem_t full, empty;
int count, in, out;

// Function prototypes
int insert_item(buffer_item item);
int remove_item(buffer_item *item);
void *consumer(void *param);
void *producer(void *param);

int main(int argc, char **argv){
  if (argc != 4){
    printf("ERROR: Provide exactly three arguments.\n");
    exit(1);
  }

  // Retrieve command line arguments
  const long int stime = strtol(argv[1], NULL, 0);
  const long int num_producer = strtol(argv[2], NULL, 0);
  const long int num_consumer = strtol(argv[3], NULL, 0);

  // Initialize
  int i;
  srand(time(NULL));
  pthread_mutex_init(&mutex, NULL);
  sem_init(&empty, 0, BUFFER_SIZE); // All of buffer is empty
  sem_init(&full, 0, 0);
  count = in = out = 0;

  // Create the producer and consumer threads
  pthread_t producers[num_producer];
  pthread_t consumers[num_consumer];
  for(i = 0; i < num_producer; i++)
    pthread_create(&producers[i], NULL, producer, NULL);
  for(i = 0; i < num_consumer; i++)
    pthread_create(&consumers[i], NULL, consumer, NULL);

  // Sleep before terminating
  sleep(stime);
  return 0;
}

// Insert item into buffer.
//Returns 0 if successful, -1 indicating error
int insert_item(buffer_item item){
  int success;
  sem_wait(&empty);
  pthread_mutex_lock(&mutex);

  // Add item to buffer
  if( count != BUFFER_SIZE){
    buffer[in] = item;
    in = (in + 1) % BUFFER_SIZE;
    count++;
    success = 0;
  }
  else
    success = -1;

  pthread_mutex_unlock(&mutex);
  sem_post(&full);
  
  return success;
}

// Remove an object from the buffer, placing it in item.
// Returns 0 if successful, -1 indicating error
int remove_item(buffer_item *item){
  int success;
  
  sem_wait(&full);
  pthread_mutex_lock(&mutex);
  
  // Remove item from buffer to item
  if( count != 0){
    *item = buffer[out];
    out = (out + 1) % BUFFER_SIZE;
    count--;
    success = 0;
  }
  else
    success = -1;

  pthread_mutex_unlock(&mutex);
  sem_post(&empty);
  
  return success;
}

void *producer(void *param){
  buffer_item item;
  while(1){
    sleep(rand() % 5 + 1); // Sleep randomly between 1 and 5 seconds
    
    item = rand();
    if(insert_item(item))
      printf("Error occured\n");
    else
      printf("Producer produced %d\n", item);
  }
}


void *consumer(void *param){
  buffer_item item;
  while(1){
    sleep(rand() % 5 + 1); // Sleep randomly between 1 and 5 seconds

    if(remove_item(&item))
      printf("Error occured\n");
    else
      printf("Consumer consumed %d\n", item);
  }
}

在我多次运行此代码之后。我得到了这样的结果。

piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 892960721
Consumer consumed 892960721
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 475993778
Producer produced 392780203
Producer produced 394885920
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 1594225387
Producer produced 1294344241
Consumer consumed 1594225387
Consumer consumed 1294344241
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 114010022
Producer produced 750521244
Producer produced 1956360586
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 1882393161
Producer produced 242009076
Consumer consumed 1882393161
Consumer consumed 1882393161
piltover@ubuntu:~/OS_experiments/os__4$ ./producer-consumer 3 3 3
Producer produced 395560134
Consumer consumed 395560134
Producer produced 1352548714
Producer produced 1419998606
Consumer consumed 1352548714
Consumer consumed 1419998606
piltover@ubuntu:~/OS_experiments/os__4$ 

我很困惑为什么结果的数量和顺序完全不同。例如,生产者和消费者的数量不相同。

标签: linuxmultithreadingoperating-system

解决方案


推荐阅读