Как контролировать количество потоков с помощью pthread_join в C?

Я создал C-программу, которая будет читать 20000 строк из текстового файла и отправлять их в другую программу. Я использовал некоторое время для циклического прохождения этого текстового файла и создания потоков, которые будут отправлять этот текст другой программе. Но я хочу, чтобы только 4 темы работали. поэтому я использовал счетчик и продолжаю уменьшать его, а также условие if для проверки счетчика, и когда он будет установлен в 1, тогда я вызвал pthread_join для предыдущих потоков. Я хочу сначала закончить эти 4 потока, а затем новые 4 потока, чтобы забрать строки нового текстового файла. Но это не работает так, как мне нужно. он обрабатывает только каждый 4-й поток 4 раза. и не забирает все записи из текстового файла.

Программа:-

int Read_record()
{
    printf("Inside Read_record()\n");
    pthread_t threads;
    int rc;
    char l_record[300];
    int thNum=4;

    while(1){
        MEMSET(g_record);

        if(fgets(g_record,300,g_r_fp)==NULL){
            printf("End of File.\n");
            break;
        }else{
            //printf("%s",g_record);
            printf("%s",g_record);
            rc = pthread_create(&threads, NULL, &Get_report, (void *)g_record);

            if (rc){
                printf("ERROR; return code from pthread_create() is %d\n", rc);
                exit(-1);
            }

            thNum--;
        }

        if(thNum==0){ 
            pthread_join(threads, NULL); 
            thNum=4;
        }
    }

    return 0;
}

Входной текстовый файл содержит: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Выход из положения приходит:-

Inside Read_record()
1
2
3
4
Inside Get_report, wget 4

Inside Get_report, wget 4

Inside Get_report, wget 4

Inside Get_report, wget 4

5
6
7
8
Inside Get_report, wget 8

Inside Get_report, wget 8

Inside Get_report, wget 8

Inside Get_report, wget 8

9
10
11
12
Inside Get_report, wget 12

Inside Get_report, wget 12

Inside Get_report, wget 12

Inside Get_report, wget 12

13
14
15
16
Inside Get_report, wget 16

Inside Get_report, wget 16

Inside Get_report, wget 16

Inside Get_report, wget 16

17
18
19
20
Inside Get_report, wget 20

Inside Get_report, wget 20

Inside Get_report, wget 20

Inside Get_report, wget 20

End of File.

Желание выхода:-

Inside Get_report, wget 1
Inside Get_report, wget 2
Inside Get_report, wget 3
Inside Get_report, wget 4

Inside Get_report, wget 5
Inside Get_report, wget 6
Inside Get_report, wget 7
Inside Get_report, wget 8

Inside Get_report, wget 9
Inside Get_report, wget 10
Inside Get_report, wget 11
Inside Get_report, wget 12.
and so on..

Пожалуйста, обратите внимание, я хочу, чтобы в системе было только 4 темы. не более того

2 ответа

Похоже, вам нужен пул потоков, посредством которого вы создаете пул из 4 потоков и сообщаете им работу через очередь. Основной поток прочитает файл и поставит в очередь задания (объект / структура со строкой текста для обработки) в очереди. Потоки возьмут работу из очереди, обработают ее, а затем получат другую работу.

Потоки не должны выходить после обработки только одного задания, а просто зацикливаться до тех пор, пока не будет указано, что их остановить

Что-то в корне неправильно в структуре вашей программы. Вот то, что я думаю, что вы хотите:

  1. Пусть основной метод читает строки
  2. У основного метода создайте 4 потока (сохраните их в массиве или что-то)
  3. Реализовать некоторую форму разделяемой памяти для отправки данных в 4 потока
  4. Вам, вероятно, понадобится некоторая форма синхронизации.
  5. после завершения работы прекратите и присоединитесь ко всем 4 потокам

надеюсь, что вы попадете на ваш путь в удивительный мир потоков

На самом деле это пул потоков, как упоминалось в другом посте.

И я нашел этот замечательный учебник по потокам, я только просмотрел таблицу индексов, но, похоже, охватил все, что вам нужно.

Другие вопросы по тегам