При успешном завершении функция возвращает число 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(X);
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(X);
for(int Count = 1;Count < *Temp;Count++){
cout << «work from thread B: " << Count << " + 2 = "
<< Count + 2 << endl;
}
cout << «Thread B complete» << endl;
}
В программе 4.2 функции taskl и task2 выполняют цикл, количество итераций которого равно числу, переданному каждой функции в качестве параметра. Одна функция увеличивает переменную цикла на два, вторая — умножает ее на два, а затем каждая из них отправляет результат в стандартный поток вывода данных. По выходу из цикла каждая функция выводит сообщение о завершении выполнения потока. Инструкции по компиляции и выполнению программ 4.1 и 4.2 содержатся в профиле программы 4.1.
[ Профиль программы 4.1
Имя программы•program4-12.cc
* ОписаниеПринимает целочисленное значение из командной строки и передает функциям: потоков. Каждая функция выполняет цикл, в котором переменная цикла увеличивается (в одной функции на два, а в другой в два раза), а затем результат отсылается в стандартный поток вывода данных. Код основного потока выполнения приведен в программе 4.1, а код функций — в программе 4.2.
Требуемая библиотекаlibpthread
Требуемые заголовки
Инструкции по компиляции и компоновке программ
с++ -о program4-12 program4-12.cc -lpthread
Среда для тестированияSuSE Linux 7.1, gcc 2.95.2,
Инструкции по выполнению ./program4-12 34
ПримечанияЭта программа требует задания аргумента командной строки.
В этом разделе был приведен пример передачи функции потока лишь одного аргумента. Если необходимо передать функции потока несколько аргументов, создайте структуру (struct) или контейнер, содержащий все требуемые аргументы, и передайте функции потока указатель на эту структуру.
Получение идентификатора потока
Как упоминалось выше, процесс разделяет все свои ресурсы с потоками, используя лишь собственное адресное пространство. Потокам в собственное пользование выделяются весьма небольшие их объемы. Идентификатор потока (id) — это один из ресурсов, уникальных для каждого потока. Чтобы узнать свой идентификатор, потоку необходимо вызвать функцию pthread_self ().
Синопсис
#include
pthread_t pthread_self(void)
Эта функция аналогична функции getpid() для процессов. При создании потока его идентификатор возвращается его создателю или вызывающему потоку. Однако идентификатор потока не становится известным созданному потоку автоматически. Но если уж поток обладает собственным идентификатором, он может передать его (предварительно узнав его сам) другим потокам процесса. Функция pthread_self ()возвращает идентификатор потока, не определяя никаких кодов ошибок.
Читать дальше