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

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