Многопоточность очень важна при высокой нагрузке на машину, когда важно быстро обрабатывать поступающую информацию. В этой статье я хочу рассказать о потоках на конкретном примере. Будут рассмотрены основные функции для работы с потоками. Более полная информация доступна на man странице pthread.
Итак, приступим. Программа создает 2 потока, которые выполняют одну и ту же функцию. Вообще говоря, потоков и функций может быть сколько угодно и модифицировать этот пример не составит особого труда. В функции каждый поток выводит свой ID, после чего спит 5 секунд и завершается.
Итак, приступим. Программа создает 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 |
Комментариев нет:
Отправить комментарий