вторник, 13 декабря 2011 г.

Потоки в C

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

Итак, приступим. Программа создает 2 потока, которые выполняют одну и ту же функцию. Вообще говоря, потоков и функций может быть сколько угодно и модифицировать этот пример не составит особого труда. В функции каждый поток выводит свой ID, после чего спит 5 секунд и завершается.

/*Листинг thread.c*/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

/*Функция для первого потока*/
void *
thread_func(void * arg)
{
    pthread_t thread = * (pthread_t *) arg;
    /*В качестве аргумента передается ID потока.
     Функция pthread_self возвращает тот же ID.
     Функция pthread_equal сравнивает ID и
     возвращает не-нулевое значение, если они
     принадлежат одному потоку.*/
    if(pthread_equal(pthread_self(), thread) != 0)
      fprintf(stderr, "thread: %i\n", (int *) arg); /*Делаем что-нибудь*/
    sleep(5);
    return NULL;
}

int main(void)
{
    pthread_t thread[2];

    /*pthread_create создает новый поток. Он записывает ID в thread,
     в качестве атрибутов указываем NULL, указываем выполняемую
     потоком функцию и передаем &thread[0] как аргумент(если
     аргументов много, можно передать их структурой)*/
    if(pthread_create(&thread[0], NULL,
            &thread_func, &thread[0]) != 0) {
        fprintf(stderr, "Error(thread1)\n");
        return 1;
    }

    /*Создание второго потока*/
    if(pthread_create(&thread[1], NULL,
            &thread_func, &thread[1]) != 0) {
        fprintf(stderr, "Error(thread2)\n");
        return 1;
    }

    fprintf(stderr, "Hello World\n");

    /*Ждем пока потоки завершатся. Аргументы идут в NULL.
     Если этого не сделать, то главная программа завершится
     вместе с потоками и они не завершат свою работу как задуманно*/
    pthread_join(thread[0], NULL);
    pthread_join(thread[1], NULL);
    return 0;
}
Вот вывод нашей программы:
Вывод thread

Комментариев нет:

Отправить комментарий