Я пытаюсь синхронизировать чтение 5 файлов, чтобы каждый символ читался из файла, а затем из следующего файла другой символ и так далее.В конце массив распечатает содержимое.Я могу читать из файлов, но синхронизация еще не завершена.Я попытался исправить это с помощью управляющей переменной, чтобы запускать блок кода только тогда, когда файлы поворачиваются, но я получаю шаткий выводВот мой раздел, в котором я работаю над критическими разделами
while(!feof(drive1)) {
if(control == 0) {
pthread_mutex_lock(&thread1);
//printf("Mutex lock\n");
c = getc(drive1);
printf("%c", (char)c);
control = 1;
pthread_mutex_unlock(&thread1);
//printf("Mutex unlock\n");
} else if(control == 1) {
pthread_mutex_lock(&thread2);
//printf("Mutex lock\n");
a = getc(drive2);
printf("%c", (char)a);
control = 2;
pthread_mutex_unlock(&thread2);
//printf("Mutex unlock\n");
} else if(control == 2) {
pthread_mutex_lock(&thread3);
//printf("Mutex lock\n");
b = getc(drive3);
printf("%c", (char)b);
control = 3;
pthread_mutex_unlock(&thread3);
//printf("Mutex unlock\n");
} else if(control == 3) {
pthread_mutex_lock(&thread4);
//printf("Mutex lock\n");
d = getc(drive4);
printf("%c", (char)d);
control = 4;
pthread_mutex_unlock(&thread4);
//printf("Mutex unlock\n");
} else if(control == 4) {
pthread_mutex_lock(&thread5);
//printf("Mutex lock\n");
e = getc(drive5);
printf("%c", (char)e);
control = 0;
pthread_mutex_unlock(&thread5);
//printf("Mutex unlock\n");
}
Сначала я попробовал сделать это, используя только один поток1, используемый для блокировки мьютексов и их разблокировки, но затем решил создать 5, чтобы посмотреть, поможет ли это, но это не так.Я также должен использовать 5 потоков, чтобы сделать это для каждого из файлов.
pthread_t th1;
pthread_create(&th1, NULL, processing, NULL);
pthread_t th2;
pthread_create(&th2, NULL, processing, NULL);
pthread_t th3;
pthread_create(&th3, NULL, processing, NULL);
pthread_t th4;
pthread_create(&th4, NULL, processing, NULL);
pthread_t th5;
pthread_create(&th5, NULL, processing, NULL);
pthread_join(th1, NULL);
pthread_join(th2, NULL);
pthread_join(th3, NULL);
pthread_join(th4, NULL);
pthread_join(th4, NULL);
Это вывод, который я получаю
И вывод должен быть "1234567890abcdefghij"
ОБНОВЛЕНИЕ: На основеВ одном из комментариев я изменил код, чтобы использовать переменную «test» в качестве того, что тестируется в критическом разделе.С этим кодом я получаю вывод 1212.
void* disk1(void* args) {
//Initializing array of files
FILE *drive[5];
drive[0] = fopen("drive1.data", "r");
drive[1] = fopen("drive2.data", "r");
drive[2] = fopen("drive3.data", "r");
drive[3] = fopen("drive4.data", "r");
drive[4] = fopen("drive5.data", "r");
int c;
if(test < initialFileSize * 2) {
pthread_mutex_lock(&thread1);
if(test % 2 == 0) {
c = getc(drive[0]);
printf("%c", (char)c);
test++;
}
if(test % 2 == 1) {
c = getc(drive[1]);
printf("%c", (char)c);
test++;
}
pthread_mutex_unlock(&thread1);
}
}