C распараллеливающий в Linux?

У кого-то есть простой пример поточной обработки в c?

Я хочу создать маленькое консольное приложение, которое будет читать txt файл файла линию за линией и затем использовать потоки для обработки всего txt. Как я должен сделать это? при разделении txt на X, где X=N потоков, первая вещь, которая прибывает по моему мнению, есть ли лучший путь?

7
задан jahmax 7 July 2010 в 19:42
поделиться

6 ответов

Поиск потоков POSIX, также известных как pthreads. Учебное пособие здесь

7
ответ дан 6 December 2019 в 06:23
поделиться

Поиск pthreads. Я тоже новичок в потоках. Вот фрагмент кода для суммирования от 1 до 1000000000 (также моя первая работающая программа pthread).

#include <stdio.h>
#include <pthread.h>

struct arg {
    int a, b;
    int *rst;
};
typedef struct arg arg;

void* sum(void *);

int main()
{
    pthread_t sum1, sum2;
    int s1, s2;
    pthread_create(&sum1, NULL, sum, &(arg){1, 500000000, &s1});
    pthread_create(&sum2, NULL, sum, &(arg){500000001, 1000000000, &s2});   
    pthread_join(sum1, NULL);
    pthread_join(sum2, NULL);
    printf("%d\n", s1 + s2);
}

void* sum(void *ptr)
{
    int i, temp = 0;
    arg *x = ptr;

    for(i = x->a; i <= x->b; ++i)
        temp += i;
    *(x->rst) = temp;   
}
8
ответ дан 6 December 2019 в 06:23
поделиться

Лучший вариант IMHO - использовать POSIX-потоки. Более подробную информацию вы можете посмотреть ЗДЕСЬ.

Также, пожалуйста, проверьте ссылку в ответе Джеймса.

8
ответ дан 6 December 2019 в 06:23
поделиться

Если вам нужен простой способ, OpenMP - мощная многопоточная библиотека, поддерживаемая gcc.

  #omp parallel for
  for(i=0; i<1000; i++){
    a[i] = b[i] + c[i];
  }

Это выполнит простое сложение двух массивов и сохранит результат в "a", но на четырехъядерной машине для этого будет порождено 4 потока (8, если поддерживается гиперпоточность).

Простое многоядерное программирование в Linux. :)

Руководство от финна: http://bisqwit.iki.fi/story/howto/openmp/

3
ответ дан 6 December 2019 в 06:23
поделиться

Прежде всего, спросите себя, действительно ли вам здесь нужна многопоточность. Вам нужно общее состояние между потоками, например попадает ли анализируемая информация из всех URL-адресов в одну и ту же структуру данных? В противном случае может быть достаточно процессов (вилка). Или вы можете даже не заходить так далеко и просто использовать программирование на основе событий (glib, libev).

Glib может стоить вашего времени, даже если вы все-таки решите использовать потоки, поскольку он имеет приличную абстракцию потоков, включая пулы потоков. Это упростит разбиение файла на разделы, так как вы просто создаете пулы потоков X, а затем добавляете пулы dl / parse к одному из них (номер строки% размер пула).

Если речь идет только об ускорении загрузки, возможно, ваша http-библиотека уже имеет соответствующие функции. Для curl есть куча curl_multicalls с интересным примером здесь .

1
ответ дан 6 December 2019 в 06:23
поделиться

разбиение текстового файла на X, где X = N из потоки, это первое, что приходит На мой взгляд, есть ли способ лучше?

Это зависит от вашего приложения.

  • Потоки могут помочь, если интерпретация данных является узким местом, прирост производительности будет ограничен скоростью файлового ввода-вывода.
  • Потоки не помогут, если чтение файла является узким местом, дисковый ввод-вывод ограничен аппаратное обеспечение и будет ухудшаться только в том случае, если больше потоков запрашивают данные

. Если интерпретация информации занимает много времени, вы можете использовать что-то вроде шаблона производителя-потребителя и самостоятельно проверить, сколько потоков вам нужно. (попробуйте с меньшим числом и посмотрите, сколько из них даст вам наилучшую производительность). Некоторые примеры можно найти здесь и здесь

Как указывают другие ответы, вы можете использовать pthreads для реализации потоковой передачи.

1
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: