Пытаясь скомпилировать мой код в linux, сделав gcc -o consumer.c -lpthread -lm, и я получаю ошибки компиляции о том, что я не объявлял о том, что я, насколько мне известно, заявил. Большинство необъявленных, похоже, связано с буферами, из которых это моя первая программа, использующая буферы. Вот ошибки (отредактированные для отражения изменений)
typedef char buffer_item buffer[BUFFER_SIZE]; // asm or __attribute__ before "buffer" both of these(expected ')' before 'item' int insert_item(buffer_item item) int insert_item(buffer_item item) int remove_item(buffer_item *item) //expected ')' before * token
и вот мой полный код после изменений
#include #include #include #include #define RAND_DIVISOR 100000000 #define TRUE 1 #define BUFFER_SIZE 1000 pthread_mutex_t mutex; //mutex lock sem_t full, empty; //semaphores typedef char buffer_item buffer[BUFFER_SIZE]; int counter; //buffer counter pthread_t tid1, tid2; //Thread ID pthread_attr_t attr; // thread attributes void *producer(void *param); // producer thread void *consumer(void *param); //consumer thread void initializeData() { pthread_mutex_init(&mutex, NULL); //Create mutex lock sem_init(&full, 0, 0); // Create the full semaphore and initialize to 0 sem_init(&empty, 0, BUFFER_SIZE); // Create the empty semaphore and initialize to BUFFER_SIZE pthread_attr_init(&attr); //default attributes counter = 0; } // Producer Thread int insert_item(buffer_item item) void *producer(void *param) { while(TRUE) { // random sleep time int rNum = rand() / RAND_DIVISOR; sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&empty); //get empty lock pthread_mutex_lock(&mutex); //get mutex lock if(insert_item(item)) { fprintf(stderr, " Producer report error condition\n"); } else { printf("producer produced %d\n", item); } pthread_mutex_unlock(&mutex); //release mutex lock sem_post(&full); //signal full } } // Consumer Thread void *consumer(void *param) { while(TRUE) { int rNum = rand() / RAND_DIVISOR; // sleep for a random period of time sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&full);// aquire the full lock */ pthread_mutex_lock(&mutex);// aquire the mutex lock if(remove_item(&item)) { fprintf(stderr, "Consumer report error condition\n"); } else { printf("consumer consumed %d\n", item); } pthread_mutex_unlock(&mutex);// release mutex lock sem_post(&empty); //signal empty } } int insert_item(buffer_item item) { // add item as long as buffer isn't full if(counter 0) { *item = buffer[(counter-1)]; counter--; return 0; } else { //buffer empty error } return -1; } int main(int argc, char *argv[]) { int i; //loop counter if(argc != 4) { fprintf(stderr, "USAGE:./main.out \n"); } int mainSleepTime = atoi(argv[1]); // sleep time in seconds int numProd = atoi(argv[2]); // producer threads int numCons = atoi(argv[3]); // consumer threads initializeData(); //initialize app for(i = 0; i < numProd; i++) { pthread_create(&tid1,&attr,producer,NULL); } for(i = 0; i < numCons; i++) { pthread_create(&tid2,&attr,consumer,NULL); } // sleep in milliseconds //sleep(mainSleepTime); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("Program Exiting\n"); exit(0); }
Изменить: последний код и скриншот ошибок http://tinypic.com/r/xptzww/9
#include #include #include #include #define RAND_DIVISOR 100000000 #define TRUE 1 #define BUFFER_SIZE 1000 pthread_mutex_t mutex; //mutex lock sem_t full, empty; //semaphores typedef char buffer_item; int counter; //buffer counter pthread_t tid1, tid2; //Thread ID pthread_attr_t attr; // thread attributes void *producer(void *param); // producer thread void *consumer(void *param); //consumer thread void initializeData() { pthread_mutex_init(&mutex, NULL); //Create mutex lock sem_init(&full, 0, 0); // Create the full semaphore and initialize to 0 sem_init(&empty, 0, BUFFER_SIZE); // Create the empty semaphore and initialize to BUFFER_SIZE pthread_attr_init(&attr); //default attributes counter = 0; } // Producer Thread int insert_item(buffer_item item) void *producer(void *param) { while(TRUE) { // random sleep time int rNum = rand() / RAND_DIVISOR; sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&empty); //get empty lock pthread_mutex_lock(&mutex); //get mutex lock if(insert_item(item)) { fprintf(stderr, " Producer report error condition\n"); } else { printf("producer produced %d\n", item); } pthread_mutex_unlock(&mutex); //release mutex lock sem_post(&full); //signal full } } // Consumer Thread void *consumer(void *param) { while(TRUE) { int rNum = rand() / RAND_DIVISOR; // sleep for a random period of time sleep(rNum); int item = rand()%100; // item is a random number between 1-100 sem_wait(&full);// aquire the full lock */ pthread_mutex_lock(&mutex);// aquire the mutex lock if(remove_item(&item)) { fprintf(stderr, "Consumer report error condition\n"); } else { printf("consumer consumed %d\n", item); } pthread_mutex_unlock(&mutex);// release mutex lock sem_post(&empty); //signal empty } } int insert_item(buffer_item item){// add item as long as buffer isn't full if(counter 0) { *item = buffer[(counter-1)]; counter--; return 0; } else { //buffer empty error } return -1; } int main(int argc, char *argv[]) { int i; //loop counter if(argc != 4) { fprintf(stderr, "USAGE:./main.out \n"); } int mainSleepTime = atoi(argv[1]); // sleep time in seconds int numProd = atoi(argv[2]); // producer threads int numCons = atoi(argv[3]); // consumer threads initializeData(); //initialize app for(i = 0; i < numProd; i++) { pthread_create(&tid1,&attr,producer,NULL); } for(i = 0; i < numCons; i++) { pthread_create(&tid2,&attr,consumer,NULL); } // sleep in milliseconds //sleep(mainSleepTime); pthread_join(tid1, NULL); pthread_join(tid2, NULL); printf("Program Exiting\n"); exit(0); }
Вы объявили, но не определен BUFFER_SIZE. Вместо
char BUFFER_SIZE;
пытаться
char BUFFER_SIZE = some_value;
где some_value должно быть чем-то между 1-255
Линия:
char buffer_item buffer[BUFFER_SIZE];
должно быть:
char buffer_item[BUFFER_SIZE];
Объявление переменной должно выглядеть так:
;
Нет стандартного типа buffer_item
. Если вы хотите использовать собственное имя типа, его можно определить:
typedef char buffer_item;
Я предполагаю, что вы хотели использовать char
для этого типа, поскольку item
должен содержать числа от 0
до 99
и для этого достаточно типа char
. После этой строки имя buffer_item
является псевдонимом для char
. Таким образом, переменные могут быть объявлены buffer_item buffer[BUFFER_SIZE];
или buffer_item item;
, В этом случае строки, такие как char buffer_item;
являются избыточными. Также вам не нужно писать char
перед buffer_item
, так как buffer_item
уже является другим именем для char
, поэтому char buffer_item;
это то же самое, что и char char;
в этом нет смысла.
Вероятно, что BUFFER_SIZE
символ BUFFER_SIZE
должен определяться при определении #define RAND_DIVISOR 100000000
. Обычно заглавные буквы в именах в C используются для макроопределений. Таким образом, вы можете установить этот размер в верхней части файла, например:
#define BUFFER_SIZE 1000
В этом случае строка char BUFFER_SIZE;
больше не требуется.
Вы используете функцию insert_item
перед ее объявлением. Итак, чтобы скомпилировать то, что вы можете поставить декларацию также сверху до producer()
:
int insert_item(buffer_item item);
Этого должно быть достаточно для компиляции кода.
Обновлено для новых ошибок
Объявление типа использует специальное ключевое слово typedef
для создания псевдонима типа. Здесь, чтобы объявить, что имя buffer_item
используется как имя типа, и оно buffer_item
char
оно должно быть точно:
typedef char buffer_item;
Буферный массив должен быть определен ниже:
buffer_item buffer[BUFFER_SIZE];
В объявлении прямой функции требуется точка с запятой в конце:
int insert_item(buffer_item item);
Я не уверен, что он будет работать так, как ожидалось, но теперь он должен быть скомпилирован.