Мораль сей басни такова: убедитесь, что любые данные, переданные потоку по ссылке, не удаляются (даже другим потоком) до тех пор, пока поток не завершит свою работу с ними. Это относится как к локальным переменным, удаляемым автоматически при выходе за пределы своей области видимости, так и к динамическим переменным, удаляемым с помощью функции
free
(или оператора
delete
в C++).
4.1.3. Значения, возвращаемые потоками
Если второй аргумент функции
pthread_join
не равен NULL, то в него помещается значение, возвращаемое потоком. Как и потоковый аргумент, это значение имеет тип
void*
. Если поток возвращает обычное число типа
int
, его можно свободно привести к типу
void*
, а затем выполнить обратное преобразование по завершении функции
Данный способ не является стандартным. В обязанности программиста входит убедиться, что в процессе подобных преобразований не произойдет потеря значащих разрядов.
Программа, представленная в листинге 4.4, в отдельном потоке вычисляет n– е простое число и возвращает его в программу. Тем временем функция
main
может продолжать свои собственные вычисления. Сразу признаемся: алгоритм последовательного деления, используемый в функции
compute_prime
, весьма неэффективен. В книгах по численным методам описаны более мощные алгоритмы (например, "решето Эратосфена").
Листинг 4.4. (primes.с) Вычисление простых чисел в потоке
#include <pthread.h>
#include <stdio.h>
/* Находим простое число с порядковым номером N, где N -- это
значение, на которое указывает параметр ARG. */
void* compute_prime(void* arg) {
int candidate = 2;
int n = *((int*)arg);
while (1) {
int factor;
int is_prime = 1;
/* Проверка простого числа путем последовательного деления. */