Один поток, который отображает несколько потоков - PullRequest
0 голосов
/ 07 мая 2020

У меня проблема с отображением данных в нескольких потоках, потому что вывод находится в неправильном порядке, а некоторые строки смешаны. Моя многопоточная функция выглядит так, и она отображает все данные.

    for (int i = 0; i < 3; i++)
    {
        pthread_create(&tid_array[i], NULL, find, &wData[i]);
    }

    for (int i = 0; i < 3; i++)
    {
        pthread_join(tid_array[i], NULL);
    }

Теперь я хочу создать буфер, в который потоки будут записывать выходные данные, а затем создать один поток, который будет отображать все данные. Понятия не имею, как это сделать. Может кто-нибудь помочь мне? ИЗМЕНИТЬ Я не хочу использовать мьютекс.

РЕДАКТИРОВАТЬ 2

    int rc;

    for (int i = 0; i < 3; i++)
    {
        rc = pthread_create(&tid_array[i], NULL, find, &wData[i]);
    }

    for (int i = 0; i < 3; i++)
    {
        rc = pthread_join(tid_array[i], NULL);
    }

    pthread_t tid;

    pthread_create(&tid, NULL, (void *)rc, NULL);
    pthread_join(tid, NULL);

Это правильный путь? Функция find извлекает все данные.

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

вывод находится в неправильном порядке, и некоторые строки смешаны

Потому что ваша программа принимает показания и записи одновременно. Например, когда один поток пытается прочитать (отобразить) контекст строки, существует по крайней мере один поток, который редактирует эту строку, поэтому он изменяет контекст строки, когда читатель не закончил читать.

Вы должны синхронизировать чтение и запись.

  • Если один из потоков пытается редактировать строку, другие потоки не должны отображаться одновременно, иначе изменения не будут видны ему / ей.

  • Однако, если некоторые потоки отображают строку, тогда другие могут читать ее одновременно. В вашем случае вы хотите, чтобы только один поток отображал строку, поэтому вы можете игнорировать это правило.

    Вы можете найти примеры реализации:

    1. Проблема чтения-записи при использовании мониторов с использованием мьютекса и сигнала

    2. Проблема чтения-записи с использованием семафора

    3. Программирование потоков POSIX очень полезное руководство по многопоточности

0 голосов
/ 07 мая 2020

Вы должны убедиться, что каждая строка написана атомарно. Можно использовать мьютекс и заставить каждый отдельный поток временно блокировать буфер. Наверное, это плохой дизайн. Вероятно, лучше, чтобы каждый поток следил за тем, чтобы он записывал всю строку за раз, поэтому используйте для этого буфер для каждого потока. Это может помешать вам использовать мьютекс, потому что это может привести к сложности и ошибкам. этот поток, извлекает содержимое буфера, разблокирует мьютекс, выводит буфер. Это дизайн, который учитывает разные приоритеты.

Неправильный порядок строк ... Что ж, это многопоточность для вас. Если это проблема, то вы, вероятно, испортили свой дизайн.

...