Шрифт:
pthread_create(&threadA,NULL, taskl,NULL) ;
pthread_create(&threadB,NULL, task2, NULL) ;
Это — два вызова функции pthread_create из листинга 4 .1. Оба потока создаются с атрибутами, действующими по умолчанию.
В программе 4 .1 отображен основной поток, который передает аргумент из командной строки в функции, выполняемые потоками.
// Программа 4.1
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
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<int *>(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<int *>(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
Требуемые заголовки <pthread.h> <iostream> <stdlib.h>
Инструкции по компиляции и компоновке программ
с++ -о program4-12 program4-12.cc -lpthread
Среда для тестирования SuSE Linux 7.1, gcc 2.95.2,
Инструкции по выполнению ./program4-12 34
Примечания Эта программа требует задания аргумента командной строки.
В этом разделе был приведен пример передачи функции потока лишь одного аргумента. Если необходимо передать функции потока несколько аргументов, создайте структуру (struct) или контейнер, содержащий все требуемые аргументы, и передайте функции потока указатель на эту структуру.
Получение идентификатора потока
Как упоминалось выше, процесс разделяет все свои ресурсы с потоками, используя лишь собственное адресное пространство. Потокам в собственное пользование выделяются весьма небольшие их объемы. Идентификатор потока (id) — это один из ресурсов, уникальных для каждого потока. Чтобы узнать свой идентификатор, потоку необходимо вызвать функцию pthread_self .
Синопсис
#include <pthread.h>