С резьбой в линуксе? - PullRequest
       4

С резьбой в линуксе?

7 голосов
/ 07 июля 2010

Есть ли у кого-нибудь простой пример многопоточности в c?

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

Ответы [ 6 ]

8 голосов
/ 08 июля 2010

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

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

8 голосов
/ 08 июля 2010

Поиск 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;   
}
6 голосов
/ 07 июля 2010

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

3 голосов
/ 08 июля 2010

Если вам нужен простой способ сделать это, 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/

1 голос
/ 08 июля 2010

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

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

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

1 голос
/ 08 июля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...