Abnormal producer consumer problem driving me nuts

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!

  1. The problem statement, all variables and given/known data:
    normally, i hate asking someone to do my homework for me but am getting desperate right now.
    i have a project about consumer producer problem. the deadline is tonight at 23:55. but i havent gotten it working yet. i just COULDNT get it to work right yet.
    the problem is as follows: the C - program will prompt for the following integer inputs:

m: the number of producer threads
n: the number of consumer threads
k: the size of the bounded buffer array
i: the number of candy items to be filled in each box
j: the number of candy items produced by each producer thread before it quits
now each producer thread produces a specific candy item, and each consumer thread takes an item out of the buffer one at a time. say producer1 produces red, prducer2 blue and so on.. as for consumer threads. after a given consumer thread has filled a given box; it prints the contents of the box as follows:
Consumer thread A filled a new box of candy containing: blue 3, red 7, green 8, ...

  1. Relevant commands, code, scripts, algorithms:

semaphores and threads are to be used.

  1. The attempts at a solution (include all code and scripts):
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include "buffer.h"
typedef int buffer_item;
#define BUFFER_SIZE k
#define RAND_DIVISOR 100000000
#define TRUE 1

/* The mutex lock */
pthread_mutex_t mutex;

/* the semaphores */
sem_t full, empty;

/* the buffer */
buffer_item buffer[BUFFER_SIZE];

/* buffer counter */
int counter;

pthread_t tid1, tid2, tid1protid, tid2con;       //Thread ID
pthread_attr_t attr; //Set of thread attributes

void *producer(void *param); /* the producer thread */
void *consumer(void *param); /* the consumer thread */

void initializeData() {

   /* Create the mutex lock */
   pthread_mutex_init(&mutex, NULL);

   /* Create the full semaphore and initialize to 0 */
   sem_init(&full, 0, 0);

   /* Create the empty semaphore and initialize to BUFFER_SIZE */
   sem_init(&empty, 0, BUFFER_SIZE);

   /* Get the default attributes */
   pthread_attr_init(&attr);

   /* init buffer */
   counter = 0;
}

/* Producer Thread */
void *producer(void *param) {
   buffer_item item;
int i;

   while(TRUE) {
      /* sleep for a random period of time */
      int rNum = rand() / RAND_DIVISOR;
      sleep(rNum);

      /* generate a random number */
      item = rand();

      /* acquire the empty lock */
      sem_wait(&empty);
      /* acquire the mutex lock */
      pthread_mutex_lock(&mutex);
 for(i = 0; i < j; i++) {
      /* Create the thread */
      pthread_create(&tidpro2,&attr,consumer,NULL);
   }      if(insert_item(item)) {
         fprintf(stderr, " Producer report error condition\n");
      }
      else {
         printf("producer produced %d\n", item);
      }
      /* release the mutex lock */
      pthread_mutex_unlock(&mutex);
      /* signal full */
      sem_post(&full);
   }
}

/* Consumer Thread */
void *consumer(void *param) {
   buffer_item item;
int q;
   while(TRUE) {
      /* sleep for a random period of time */
      int rNum = rand() / RAND_DIVISOR;
      sleep(rNum);
   for(i = 0; q< n; i++) {
      /* Create the thread */
      pthread_create(&tid2,&attr,consumer,NULL);
   }      /* aquire the full lock */
      sem_wait(&full);
      /* aquire the mutex lock */
      pthread_mutex_lock(&mutex);

      if(remove_item(&item)) {
         fprintf(stderr, "Consumer report error condition\n");
      }
      else {
         printf("consumer consumed %d\n", item);
      }
      /* release the mutex lock */
      pthread_mutex_unlock(&mutex);
      /* signal empty */
      sem_post(&empty);
   }
}

/* Add an item to the buffer */
int insert_item(buffer_item item) {
   /* When the buffer is not full add the item
      and increment the counter*/
   if(counter < BUFFER_SIZE) {
      buffer[counter] = item;
      counter++;
      return 0;
   }
   else { /* Error the buffer is full */
      return -1;
   }
}

/* Remove an item from the buffer */
int remove_item(buffer_item *item) {
   /* When the buffer is not empty remove the item
      and decrement the counter */
   if(counter > 0) {
      *item = buffer[(counter-1)];
      counter--;
      return 0;
   }
   else { /* Error buffer empty */
      return -1;
   }
}

int main(int argc, char *argv[]) {
   /* Loop counter */
   int i;

   /* Verify the correct number of arguments were passed in */
   if(argc != 5) {
      fprintf(stderr, "USAGE:./main.out <INT> <INT><INT><INT> <INT>\n");
   }

   int mainSleepTime = atoi(argv[1]); /* Time in seconds for main to sleep */
   int m = atoi(argv[2]); /* Number of producer threads */
   int n = atoi(argv[3]); /* Number of consumer threads */
   int i = atoi(argv[4]); /* Number of producer threads */
   int j = atoi(argv[5]); /* Number of consumer threads */
   int k = atoi(argv[2]); /* Number of producer threads */
   initializeData();

   /* Create the producer threads */
   for(i = 0; i < m; i++) {
      /* Create the thread */
      pthread_create(&tid1,&attr,producer,NULL);
    }

   /* Create the consumer threads */
   for(i = 0; i < n; i++) {
      /* Create the thread */
      pthread_create(&tid2,&attr,consumer,NULL);
   }

   /* Sleep for the specified amount of time in milliseconds */
   //sleep(mainSleepTime);
    pthread_join(tid1, NULL);

    pthread_join(tid2, NULL);

   /* Exit the program */
   printf("Exit the program\n");
   exit(0);
}
  1. Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
    School: Busitema University Uganda
    State: Central
    Course: operating systems
    Professor: Pierre L G.
    Course No. CENG 341

Note: Without school/professor/course information, you will be banned if you post here! You must complete the entire template (not just parts of it).

am done here, thanks to all those who pointed out a thing or two :). the baby is up and running now. hehehe:D:D:D