У кого-то есть простой пример поточной обработки в c?
Я хочу создать маленькое консольное приложение, которое будет читать txt файл файла линию за линией и затем использовать потоки для обработки всего txt. Как я должен сделать это? при разделении txt на X, где X=N потоков, первая вещь, которая прибывает по моему мнению, есть ли лучший путь?
Поиск потоков POSIX, также известных как pthreads. Учебное пособие здесь
Поиск 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;
}
Лучший вариант IMHO - использовать POSIX-потоки. Более подробную информацию вы можете посмотреть ЗДЕСЬ.
Также, пожалуйста, проверьте ссылку в ответе Джеймса.
Если вам нужен простой способ, 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/
Прежде всего, спросите себя, действительно ли вам здесь нужна многопоточность. Вам нужно общее состояние между потоками, например попадает ли анализируемая информация из всех URL-адресов в одну и ту же структуру данных? В противном случае может быть достаточно процессов (вилка). Или вы можете даже не заходить так далеко и просто использовать программирование на основе событий (glib, libev).
Glib может стоить вашего времени, даже если вы все-таки решите использовать потоки, поскольку он имеет приличную абстракцию потоков, включая пулы потоков. Это упростит разбиение файла на разделы, так как вы просто создаете пулы потоков X, а затем добавляете пулы dl / parse к одному из них (номер строки% размер пула).
Если речь идет только об ускорении загрузки, возможно, ваша http-библиотека уже имеет соответствующие функции. Для curl есть куча curl_multicalls с интересным примером здесь .
разбиение текстового файла на X, где X = N из потоки, это первое, что приходит На мой взгляд, есть ли способ лучше?
Это зависит от вашего приложения.
. Если интерпретация информации занимает много времени, вы можете использовать что-то вроде шаблона производителя-потребителя и самостоятельно проверить, сколько потоков вам нужно. (попробуйте с меньшим числом и посмотрите, сколько из них даст вам наилучшую производительность). Некоторые примеры можно найти здесь и здесь
Как указывают другие ответы, вы можете использовать pthreads для реализации потоковой передачи.