Создание потоков
Библиотека Pthreads используется для создания, поддержки и управления потоками многопоточных программ и приложений. При создании многопоточной программы потоки могут создаваться на любом этапе выполнения процесса, поскольку это — динамические образования. Функция pthread_create() создает новый поток в адресном пространстве процесса. Параметр thread указывает на дескриптор, или идентификатор (id), создаваемого потока. Новый поток будет иметь атрибуты, заданные объектом attr. Созданный поток немедленно приступит к выполнению инструкций, заданных параметром start_routine с использованием аргументов, заданных параметром arg. При успешном создании потока функция возвращает его идентификатор (id), значение которого сохраняется в параметре thread.
Синопсис
#include
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*),
void *restrict arg) ;
Если параметр attr содержит значение NULL, новый поток будет использовать атрибуты, действующие по умолчанию. В противном случае новый поток использует атрибуты, заданные параметром attr при его создании. Если же значение параметра attr изменится после того, как поток был создан, это никак не отразится на его атрибутах. При завершении параметра-функции start_routine завершается и поток, причем так, как будто была вызвана функция pthread_exit() с использованием в качестве статуса завершения значения, возвращаемого функцией start_routine.
При успешном завершении функция возвращает число 0 . В противном случае по-не создается, и функция возвращает код ошибки. Если в системе отсутствуют ресурсы для создания потока, или в процессе достигнут предел по количеству возможных потоков, выполнение функции считается неудачным. Неудачным оно также будет в случае, если атрибут потока задан некорректно или если инициатор вызова потока не имеет разрешения на установку необходимых атрибутов потока.
Приведем примеры создания двух потоков с заданными по умолчанию атрибутами:
pthread_create(&threadA,NULL, taskl,NULL) ;
pthread_create(&threadB,NULL, task2, NULL) ;
Это — два вызова функции pthread_create () из листинга 4 .1. Оба потока создаются с атрибутами, действующими по умолчанию.
В программе 4 .1 отображен основной поток, который передает аргумент из командной строки в функции, выполняемые потоками.
// Программа 4.1
#include
#include
#include
int main(int argc, char *argv[]) {
pthread_t ThreadA,ThreadB;
int N;
if(argc != 2) {
cout << «error» << endl;
exit (1);
}
N = atoi(argv[l]);
pthread_create(&ThreadA,NULL, taskl,&N);
pthread_create(&ThreadB,NULL, task2, &N);
cout « «Ожидание присоединения потоков.» « endl;
pthread_join(ThreadA,NULL) ;
pthread_join(ThreadB,NULL);
return (0) ;
};
В программе 4 .1 показано, как основной поток может передать аргументы из командной строки в каждую из потоковых функций. Число в командной строке имеет строковый тип. Поэтому в основном потоке аргумент сначала преобразуется в целочисленное значение, и только после этого результат преобразования передается при каждом вызове функции pthread_create () посредством ее последнего аргумента.
В программе 4.2 представлена каждая из потоковых функций.
// Программа 4.2
void *task1(void *X)
{
int *Temp;
Temp = static_cast
for(int Count = 1;Count < *Temp;Count++){
cout << «work from thread A: " << Count << " * 2 = "
<< Count * 2 << endl;
}
cout << «Thread A complete» << endl;
}
void *task2(void *X)
{
int *Temp;
Temp = static_cast
for(int Count = 1;Count < *Temp;Count++){
cout << «work from thread B: " << Count << " + 2 = "
<< Count + 2 << endl;
}
cout << «Thread B complete» << endl;
}