У меня проблема в моей программе.Для упражнений в школе я попытался составить программу, которая считывает входные данные и выводит их на выход.Так просто.Тем не менее, когда я запускаю следующую программу, кажется, застрял.Я печатаю некоторые сообщения, и они обычно, в зависимости от потоков, заканчиваются так:
- сигнализирующий поток 2
- ожидающий поток 1
- в ожидании потока2
Я не понимаю, как это может произойти.Предполагается, что поток 1 сигнализирует другой поток, но они все равно оказываются в состоянии ожидания, поток 2 не прерывается во время цикла, хотя и получил сигнал.Теперь, когда я раскомментирую свои комментарии, где я физически изменяю свои num_of_chars и записанные значения, это работает.Тем не менее, эта программа работает медленно.Пожалуйста, если у вас есть идеи, почему это не работает, почему pthread_cond_signal не работает, дайте мне знать.Также, если вы знаете, как эта программа может работать немного быстрее, я был бы великолепен.:) программа
#define V 300
pthread_cond_t loading;
pthread_cond_t write_down;
pthread_mutex_t mutex;
char a[V];
int num_of_chars = 0;
int written = 0;
void *input() {
while(1){
pthread_mutex_lock(&mutex);
while(num_of_chars > 0){
printf("waiting for a signal from thread2");
fflush(stdout);
pthread_cond_wait(&loading, &mutex);
}
num_of_chars = fread(a, sizeof(char), V, stdin);
if(num_of_chars == 0){
//written = 3;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&write_down);
pthread_exit(NULL);
}
if(num_of_chars <= V){
printf("signalizing thread2");
fflush(stdout);
//written = 3;
pthread_cond_signal(&write_down);
}
pthread_mutex_unlock(&mutex);
}
}
void *output() {
while(1){
while(written == 0){
printf("waiting for a signal from thread1");
fflush(stdout);
pthread_cond_wait(&write_down, &mutex);
}
written = fwrite(a, sizeof(char), num_of_chars, stdout);
fflush(stdout);
if(num_of_chars == 0){
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
if(num_of_chars > 0){
printf("signalizing thread1");
fflush(stdout);
//written = 0;
//num_of_chars = 0;
pthread_cond_signal(&loading);
}
pthread_mutex_unlock(&mutex);
}
}
int main (void) {
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init (&loading, NULL);
pthread_cond_init (&write_down, NULL);
pthread_create(&t1, NULL, input, NULL);
pthread_create(&t2, NULL, output, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
/*pthread_mutex_destroy(&mutex);
pthread_cond_destroy (input);
pthread_cond_destroy(output);*/
return 0;
}