pthread_cond_wait und pthread_cond_signal

lordosiris

Mitglied
Hi,

folgendes Kopierprogramm läuft irgendwie nicht. Die beiden Threads warten auf das Signal, das ich aber in der Main sende bzw. danach jeweils am Ende der Threads.

Sieht jemand einen Fehler?
C:
#include <stdio.h>
#include <pthread.h> 
#include <unistd.h> 
#include <string.h>
#include <stdlib.h>

void *functionRead(void *argv);
void *functionWrite(void *argv);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t condRead = PTHREAD_COND_INITIALIZER;
pthread_cond_t condWrite = PTHREAD_COND_INITIALIZER;

FILE* Datei1;
FILE* Datei2;

int n, x = 1, i = 0, j, c = 0, d = 0, rc;

pthread_t pRead;
pthread_t pWrite;

char ringpuffer[10000];


int main(int argc, char **argv)
{
	if (argc == 4){
		n = atoi(argv[3]);
	} else {
		printf("Need 3 Parameter: File1, File2, Charblock Size n!\n");
		exit(EXIT_FAILURE);
	}
	printf("File to Copy: %s\nTarget: %s\nHow many chars: %s\n", argv[1], argv[2], argv[3]);
	
	pthread_create(&pWrite, NULL, &functionWrite, ((void *)argv));
	pthread_create(&pRead, NULL, &functionRead, ((void *)argv));
	
	printf("Created, Sending Signal\n");
	pthread_cond_signal(&condRead);
	
	pthread_join(pWrite, NULL);
	printf("Everything's done!\n");
	return 0;
}

void *functionRead(void *argv){
	char **args = (char **) argv;
	if ((Datei1=fopen(args[1], "r")) == NULL){perror("fopen\n"); exit(EXIT_FAILURE);}
	n = atoi(args[3]);
	printf("Entered functionRead\n");
	do{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&condRead, &mutex);
		i = 0;
		for(i = 0; i<=n; i++){
			c = fgetc(Datei1);
			ringpuffer[i] = c;
			i++;
		}
		x++;
		pthread_mutex_unlock(&mutex);
		pthread_cond_signal(&condWrite);
	}while ((c=fgetc(Datei1)) != EOF);
	
	if ((fclose(Datei1)) == EOF){perror("fclose\n"); exit(EXIT_FAILURE);}
	return 0;
}

void *functionWrite(void *argv){
	char **args = (char **) argv;
	if ((Datei2=fopen(args[2], "w")) == NULL){perror("fopen\n"); exit(EXIT_FAILURE);}
	n = atoi(args[3]);
	printf("Entered functionWrite\n");
	sleep(5);
	for (j = 0; j < x; j++){
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&condWrite, &mutex);
		fwrite(ringpuffer, 1, sizeof(ringpuffer), Datei2);
		pthread_mutex_unlock(&mutex);
		pthread_cond_signal(&condRead);
	}
	
	if ((fclose(Datei2)) == EOF){perror("fclose\n"); exit(EXIT_FAILURE);}
	return 0;
}
 
Hi.

Die signal Funktion weckt nur Threads auf die im Moment auf die Variable warten.

Falls die read Funktion noch nicht beim wait angekommen ist wenn das Signal kommt, wird sie auch nicht aufgeweckt und das Signal nie erhalten.

Gruß
 
Zurück