Основы программирования в Linux
Шрифт:
#include <рthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr,
int *detachstate);
int pthread_attr_setschedpolicy(pthread_attr_t* attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int* policy);
int pthread_attr_setschedparam(pthread_attr_t *attr,
const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr,
struct sched_param *param);
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
int pthread_attr_getinheritsched(const pthread_attr_t *attr,
int *inherit);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);
int pthread_attr_getstacksize(const pthread_attr_t *attr, int* scope);
Как
detachedstate
— этот атрибут позволяет избежать необходимости присоединения потоков (rejoin). Как и большинство этих функций с префиксом _set
, эта функция принимает указатель на атрибут и флаг для определения требуемого состояния. Два возможных значения флага для функции attr_setdetachstate
— PTHREAD_CREATE_JOINABLE
и PTHREAD_CREATE_DETACHED
. По умолчанию у атрибута будет значение PTHREAD_CREATE_JOINABLE
, поэтому вы сможете разрешить двум потокам объединяться (один ждет завершения другого). Если задать состояние PTHREAD_CREATE_DETACHED
, вы не сможете вызвать функцию pthread_join
, чтобы выяснить код завершения другого потока.
schedpolicy
— этот атрибут управляет планированием потоков. Возможные значения — SCHED_OTHER
, SCHED_RR
и SCHED_FIFO
. По умолчанию атрибут равен SCHED_OTHER
. Два других типа планирования доступны только для процессов, выполняющихся с правами суперпользователя, поскольку они оба задают планирование в режиме реального времени, но с немного разным поведением. SCHED_RR
использует круговую или циклическую схему планирования, a SCHED_FIFO
— алгоритм "первым прибыл, первым обслужен". Оба эти алгоритма не обсуждаются в этой книге.
schedparam
— это напарник атрибута schedpolicy
и позволяет управлять планированием потоков, выполняющихся
SCHED_OTHER
. Мы рассмотрим пример его применения чуть позже в этой главе.
inheritsched
— этот атрибут принимает одно из двух значений: PTHREAD_EXPLICIT_SCHED
и PTHREAD_INHERIT_SCHED
. По умолчанию значение атрибута PTHREAD_EXPLICIT_SCHED
, что означает планирование, явно заданное атрибутами. Если задать PTHREAD_INHERIT_SCHED
, новый поток будет вместо этого применять параметры, используемые потоком, создавшим его.
scope
— этот атрибут управляет способом вычисления параметров планирования потока. Поскольку ОС Linux в настоящее время поддерживает единственное значение PTHREAD_SCOPE_SYSTEM
, мы не будем рассматривать его в дальнейшем.
stacksize
— этот атрибут управляет размером стека при создании потока, задается в байтах. Это часть необязательного раздела стандарта и поддерживается только в тех реализациях, у которых определено значение _PTHREAD_THREAD_ATTR_STACKSIZE
. Linux по умолчанию реализует потоки со стеком большого размера, поэтому этот атрибут в ОС Linux избыточен. Выполните упражнение 12.5.
Упражнение 12.5. Установка атрибута отсоединенного состояния
В примере с отсоединенным или обособленным потоком thread5.c вы создаете атрибут потока, задаете состояние потока как отсоединенное и затем создаете с помощью этого атрибута поток. Теперь, когда закончится дочерний поток, он вызовет обычным образом
pthread_exit
. В это время исходный поток больше не ждет созданный им поток для присоединения. В данном примере используется простой флаг thread_finished
, чтобы позволить потоку main
определить, закончился ли дочерний поток, и показать, что потоки все еще совместно используют переменные.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void *thread_function(void *arg);
char message[] = "Hello World";
int thread_finished = 0;
int main {
int res;
pthread_t a_thread;
pthread_attr_t thread_attr;
res = pthread_attr_init(&thread_attr);
if (res != 0) {
perror("Attribute creation failed");
exit(EXIT_FAILURE);
}
res = pthread_attr_setdetachstate(&thread_attr,
PTHREAD_CREATE_DETACHED);
if (res != 0) {
perror("Setting detached attribute failed");
exit(EXIT_FAILURE);
Поделиться:
Популярные книги
Неудержимый. Книга XXXVII
37. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 5
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Играть... в тебя
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Черные ножи 2
2. Черные ножи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Хорунжий
1. Индийский поход
Фантастика:
попаданцы
альтернативная история
5.40
рейтинг книги
Печать Пожирателя 3
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Лихие. Депутат
4. Бригадир
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Я еще не барон
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Технарь
1. Технарь
Фантастика:
космическая фантастика
попаданцы
7.13
рейтинг книги
Я все еще не царь. Книга XXVI
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 8
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 14
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Воевода
5. Помещик
Фантастика:
альтернативная история
5.00