Как подключить поток к каналам и получить эту информацию к другому потоку? - PullRequest
0 голосов
/ 18 января 2019

Имеется 4 входа (4 трубы) и 10 выходов (10 труб).Каждый из них должен быть прочитан индивидуально и одновременно с другими.Каждый входной канал получает строки, которые идентифицируют контейнеры (это программа, которая воссоздает обработку контейнеров на складе и затем отправляет их одному из 10 пунктов назначения), эти строки также содержат серийный номер и пункт назначения.

Строкидолжны быть обработаны каждой из труб.Затем они помещаются в одну очередь (они должны оставаться там в течение 1 секунды перед обработкой).Затем они отправляются в матрицу измерения [n] [n] для ожидания от 1 до 5 секунд, после чего их направляют в одну из 10 выходных очередей в соответствии с пунктом назначения (например, «LND» для Лондона).

Для каждого контейнера в матрице создается поток, который ждет от 1 до 5 секунд, упомянутых ранее, после чего он помещается в выходные очереди.Каждая очередь имеет выделенный поток для своей обработки и ждет 2 секунды, прежде чем записать ее в один из выходных каналов.

Я не понимаю, как соединить каждую часть (поток с каналом к ​​потоку, а затем к очередии т. д.).

Мы пробовали много разных способов соединить потоки с каналами и записать в файлы необходимую информацию, но без положительных результатов.

ПРИМЕР КОДА: (здесь мы генерируемслучайные uuids для каждого контейнера)

Код для чтения канала

#define MAX_NUM_THREADS 3

void *ler_do_pipe(void *_fd) { //Reads from the pipes
    int fd;
    fd = (int) _fd;
    char buffer[4096];
    int n;
    while ((n = read(fd, buffer, 4096)) > 0) {
        write(1, buffer, n);
    }
}

int main() {
    pthread_t threads[MAX_NUM_THREADS];
    char fifo[5];
    int fd, i;

    for (i = 0; i < MAX_NUM_THREADS; i++) {
        sprintf(fifo, "fifo%d", i);
        fd = open(fifo, O_RDONLY); 
        pthread_create(&threads[i], NULL, ler_do_pipe, (void *)fd);  
    }

    pthread_exit(NULL);
    return 0; 
}

код, который я использую для записи канала

/*writes to the respective pipe*/
void *escrever_para_pipe(void *_fd) {
    int fd;
    fd = (int) _fd;

    while(1) {
        char txt[43];

        /*criamos uma string do genero "uuid,destino" totalmente random */
    /*we create a string with the "serial Number,destination" all random*/
        sprintf(txt,"%s,%s\n",getuuid(),getPorto());

        write(fd, txt, 43);  
        sleep(2);
    }       
}

int main () {

    //We create 3 threads to the 3 pipes we have
    pthread_t threads[MAX_NUM_THREADS];
    char fifo[5];
    int fd, i;

    for (i = 0; i < MAX_NUM_THREADS; i++) {
        sprintf(fifo, "fifo%d", i);
        mkfifo(fifo, 0666);
    }

    for (i = 0; i < MAX_NUM_THREADS; i++) {
        sprintf(fifo, "fifo%d", i);
        fd = open(fifo, O_WRONLY); 
        pthread_create(&threads[i], NULL, escrever_para_pipe, (void*)fd);  
    }

    pthread_exit(NULL);
    return 0;
}

Я ожидаю, что информация будет течьмежду трубами и нитями, но мы не можем соединить их.

...