无法获得互斥锁以防止线程访问函数

Not able to get mutex locks to prevent threads from accessing a function

正在处理 class 的生产者和消费者问题,但在进行最后的润色时遇到了麻烦。我遇到的问题是我认为我的互斥锁没有将我的线程锁定在函数之外。例如,如果我 运行 程序并将参数传递给它 2 4 4 7 它将打印 8 个 7,然后 2 秒后它将打印 8 个 8,然后打印 8 个 9,依此类推。我试过使用 trylock 并在信号量周围移动但无济于事。当这导致 none 个线程被锁定时,我是否遗漏了什么?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
typedef int buffer_item;
#define BUFFER_SIZE 5
#define TRUE 1


buffer_item START_NUMBER;
int counter;
int insert_item(buffer_item item);
int remove_item(buffer_item *item);  
buffer_item buffer[BUFFER_SIZE];
void* producer(void *ptr);
void* consumer(void *ptr);  
pthread_cond_t condc, condp;
pthread_mutex_t mutex;
int sleepTime, producerThreads, consumerThreads,a;
pthread_attr_t attr;
sem_t full, empty;

int insert_item(buffer_item item)
{
   if(counter < BUFFER_SIZE) {
      buffer[counter] = item;
      counter++;
      return 0;
   }
   else { 
      return -1;
   }
}
int remove_item(buffer_item *item)
{
   if(counter > 0) {
      *item = buffer[(counter-1)];
      counter--;
      return 0;
   }
   else { 
      return -1;
   }
}

void* producer(void *ptr) {
     buffer_item item;
     item = START_NUMBER;
   while(TRUE) {
      sleep(sleepTime);     
      sem_wait(&empty);
      pthread_mutex_lock(&mutex);    
      if(insert_item(item)) {
         fprintf(stderr, "error \n");
      }
      else {
         printf("producer%u produced %d\n", (unsigned int)pthread_self(),item);
         item++;
      }     
      pthread_mutex_unlock(&mutex);
      sem_post(&full);
   }
        }
void* consumer(void *ptr) {
   buffer_item item;
   while(TRUE) {
      sleep(sleepTime);
      sem_wait(&full);
      pthread_mutex_lock(&mutex);
      if(remove_item(&item)) {
         fprintf(stderr, "error \n");
      }
      else {
         printf("consumer%u consumed %d\n", (unsigned int)pthread_self(),item);
      }
      pthread_mutex_unlock(&mutex);
      sem_post(&empty);

   }
}
void initializeData() {
   pthread_mutex_init(&mutex, NULL);
   sem_init(&full, 0, 0);
    sem_init(&empty, 0, BUFFER_SIZE);
   pthread_attr_init(&attr);
   counter = 0;
}

int main(int argc, char **argv) {

    sleepTime = atoi(argv[1]);
    producerThreads = atoi(argv[2]);
    consumerThreads = atoi(argv[3]);
    START_NUMBER = atoi(argv[4]);
    initializeData();
    pthread_t pro, con;


    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&condc, NULL); 
    pthread_cond_init(&condp, NULL); 

   for(a=0; a< consumerThreads;a++)
    pthread_create(&con, NULL, consumer, NULL);
    for(a=0;a<producerThreads;a++)
    pthread_create(&pro, NULL, producer, NULL);


    pthread_join(con, NULL);
    pthread_join(pro, NULL);


    pthread_mutex_destroy(&mutex); 
    pthread_cond_destroy(&condc); 
    pthread_cond_destroy(&condp); 
    sleep(sleepTime);

}

感谢德米特里的帮助,在绕过你告诉我的路线并与我的一位朋友讨论后,我终于开始输出正确的数字!

This is the output i have been looking for

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
typedef int buffer_item;
#define BUFFER_SIZE 5
#define TRUE 1


buffer_item START_NUMBER;
buffer_item item; 
int counter;
int insert_item(buffer_item item);
int remove_item(buffer_item *item);  
buffer_item buffer[BUFFER_SIZE];
void* producer(void *ptr);
void* consumer(void *ptr);  
pthread_cond_t condc, condp;
pthread_mutex_t mutex;
int sleepTime, producerThreads, consumerThreads, a, item;
pthread_attr_t attr;
sem_t full, empty;

int insert_item(buffer_item item)
{
   if(counter < BUFFER_SIZE) {
      buffer[counter] = item;
      counter++;
      return 0;
   }
   else { 
      return -1;
   }
}
int remove_item(buffer_item *item)
{
   if(counter > 0) {
      *item = buffer[(counter-1)];
      printf("consumer%u consumed %d\n", (unsigned int)pthread_self(),buffer[counter-1]);
      counter--;
      return 0;
   }
   else { 
      return -1;
   }
}

void* producer(void *ptr) {     
   while(TRUE) {
      sleep(sleepTime);     
      sem_wait(&empty);
      pthread_mutex_lock(&mutex);    
      if(insert_item(START_NUMBER)) {
         fprintf(stderr, "error \n");
      }
      else {
        printf("producer%u produced %d\n", (unsigned int)pthread_self(),START_NUMBER);
        START_NUMBER++;
      }     
      pthread_mutex_unlock(&mutex);
      sem_post(&full);
  }
 }

void* consumer(void *ptr) {
   while(TRUE) {
      sleep(sleepTime);
      sem_wait(&full);
      pthread_mutex_lock(&mutex);
      if(remove_item(&item)) {
         fprintf(stderr, "error \n");
      }
      else {
        // printf("consumer%u consumed %d\n", (unsigned int)pthread_self(),&START_NUMBER);
      }
      pthread_mutex_unlock(&mutex);
      sem_post(&empty);

   }
}
void initializeData() {
   pthread_mutex_init(&mutex, NULL);
   sem_init(&full, 0, 0);
    sem_init(&empty, 0, BUFFER_SIZE);
   pthread_attr_init(&attr);
   counter = 0;
}

int main(int argc, char **argv) {

    sleepTime = atoi(argv[1]);
    producerThreads = atoi(argv[2]);
    consumerThreads = atoi(argv[3]);
    START_NUMBER = atoi(argv[4]);
    item = START_NUMBER;
    initializeData();
    pthread_t pro, con;


    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&condc, NULL); 
    pthread_cond_init(&condp, NULL); 

   for(a=0; a< consumerThreads;a++)
    pthread_create(&con, NULL, consumer, NULL);
    for(a=0;a<producerThreads;a++)
    pthread_create(&pro, NULL, producer, NULL);


    pthread_join(con, NULL);
    pthread_join(pro, NULL);


    pthread_mutex_destroy(&mutex); 
    pthread_cond_destroy(&condc); 
    pthread_cond_destroy(&condp); 
    sleep(sleepTime);

}