Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Синопсис. #include <pthread.h>






#include < pthread.h>

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 < 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>






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.