Сделай конспект:
1.1. Создание потоков.
Существует целый ряд библиотечных вызовов, связанных с потоками, большинство имен 
которых начинается с префикса pthread. Для применения этих библиотечных вызовов вы должны 
определить макрос _REENTRANT включить файл pthread.h и скомпоновать программу с 
библиотекой потоков, используя опцию -lpthread
Когда разрабатывались первые версии библиотечных подпрограмм UNIX и POSIX, 
предполагалось, что в каждом процессе будет только один поток исполнения. 
В многопоточных программах вы сообщаете компилятору, что вам нужно это 
средство, определяя в вашей программе макрос _REENTRANT до любых директив #include
При этом делаются три вещи и столь искусно, что обычно вам даже не нужно знать, какая 
работа проделана.
Некоторые функции получают безопасный реентерабельный вариант прототипа или 
объявления. При этом имя функции остается обычно прежним, но в конце добавляется суффикс 
_r
Некоторые функции из файла stdio.h, которые обычно реализованы как макросы, 
становятся соответствующими реентерабельными безопасными функциями.
Включение файла pthread.h предоставляет другие прототипы и определения, которые 
нужны в вашем программном коде, во многом так же, как делает stdio.h для подпрограмм 
стандартного ввода и вывода. В заключение следует убедиться в том, что вы включили в 
программу соответствующий заголовочный файл потоков и скомпоновали программу с 
подходящей библиотекой потоков, в которой реализованы функции семейства pthread.
Функция pthread_create создает новый поток во многом так же, как функция fork создает новый 
процесс.
Синтаксис
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void 
*(*start_routine)(void*), void *arg);
Параметры
Первый аргумент - указатель на переменную типа pthread_t. Когда поток создан, в область 
памяти, на которую указывает эта переменная, записывается идентификатор. Этот 
идентификатор позволяет ссылаться на поток. 
Следующий аргумент задает атрибуты потока. Обычно нет нужды в особых атрибутах, и вы 
можете просто передать в этом аргументе NULL
В последних двух аргументах потоку передается функция, которую он должен начать 
выполнять, и аргументы, которые нужно передать этой функции void *(*start_routine)(void *)
Предыдущая строка просто говорит о том, что вы должны передать адрес функции, 
принимающей бестиповой указатель void как параметр, и функция вернет указатель на void
Следовательно, вы можете передать единственный аргумент любого типа и вернуть 
указатель на любой тип. Применение функции fork заставит продолжить вы