Как выполнять задачи одновременно в C? - PullRequest
0 голосов
/ 28 сентября 2019

Я пишу простую программу на C, которая позволяет мне копировать файл в каталоге.

Я хочу, чтобы эти файлы копировались параллельно, чтобы я мог дать программе новые «запросы на копирование», даже когдаеще не все файлы были скопированы.Я хочу, чтобы копирование происходило одновременно.

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

char source_name[256]; /* source file name */
char target_name[256]; /* target file name */

int sourcefile, targetfile;

FILE *logfile;

#define SIZE 4096

typedef struct {
    unsigned long size;
} FILEBLOCK;

void *copythread(void *arg);

void read_source_target(void) {

    FILEBLOCK file;

    struct stat f_stat;

    printf("Source name: ");
    scanf("%s", source_name);

    printf("Target name: ");
    scanf("%s", target_name);

    stat(source_name, &f_stat);
    printf("Size of file is %lu bytes.\n", f_stat.st_size);

    file.size = f_stat.st_size;

    pthread_t thread_id;

    pthread_create(&thread_id, NULL, copythread, &file);
}

void *copythread(void *arg) {

    FILEBLOCK *file;
    char data[SIZE];
    int i, x;

    file = (FILEBLOCK *) arg;

    sourcefile = open(source_name, O_RDONLY);
    targetfile = open(target_name, O_WRONLY | O_CREAT, 0666);

    while (i < file->size) {
        x = read(sourcefile, data, SIZE);
        write(targetfile, data, x);
        i += x;
    }

    close(targetfile);
    close(sourcefile);

    return NULL;
}

int main() {
    while (1) {
        read_source_target();
    }
}

Я пытаюсь использовать 'pthread_create' для создания нового потока при каждом вводе нового запроса на копирование.

Я проверил это с файлом 2 ГБ, чтобы я мог проверить этот параллелизм, но, похоже, он не работает.Я попытался скопировать файл 3 раза, и первая копия работает нормально, но две копии после не копируются полностью.

Как правильно реализовать параллелизм?

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...