The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Каталог документации / Раздел "Программирование в Linux" / Оглавление документа
next up previous contents
Next: Синхронизация потоков Up: Атрибуты потоков Previous: Размер стека в потоке   Contents

Создание собственного стека потока

Обычно создание собственного стека предполагает, что он будет немного отличаться от стека по умолчанию. Как правило, задача состоит в выделении более чем одного мегабайта для стека. Иногда стек по умолчанию, наоборот, является слишком большим. Можно создать тысячи потоков, и тогда виртуальной памяти будет недостаточно, чтобы работать с гигабайтами пространств стека при использовании размера по умолчанию.

Абсолютный минимальный предел размера стека можно определить, вызывая макрос PTHREAD_STACK_MIN (определенный в
<pthread.h>), который возвращает количество памяти стека, требуемого для потока, выполняющего пустую процедуру (NULL). Реальные потоки нуждаются в большем стеке, поэтому нужно очень осторожно сокращать его размер.

Функция pthread_attr_setstacksize() используется для установки размера стека текущего потока.

Атрибут stacksize определяет размер стека в байтах. Этот стек выделяется системой и его размер не должен быть меньше минимального. При успешном завершении функция возвращает 0. Пример вызова:

#include <pthread.h>

pthread_attr_t tattr;

int stacksize;

int ret;

/* установка нового размера */

stacksize = (PTHREAD_STACK_MIN + 0x4000);

ret = pthread_attr_setstacksize(&tattr, stacksize);

Если размер стека равен 0, используется размер по умолчанию.

Функция pthread_attr_getstacksize(pthread_attr_t *tattr, size_t *size) используется для получения размера стека текущего потока:

#include <pthread.h>

pthread_attr_t tattr;

int stacksize;

int ret;

/* получение размера стека */

ret = pthread_attr_getstacksize(&tattr, &stacksize);

Размер стека возвращается в переменную stacksize.

Иногда возникает потребность установить базовый адрес стека. Для этого используется функция pthread_attr_setstackaddr():

int pthread_attr_setstackaddr(pthread_attr_t *tattr,

    void *stackaddr);

Параметр stackaddr определяет базовый адрес стека потока. Если это значение не пусто (не равно NULL), то система инициализирует стек по указанному адресу.

Следующий пример показывает способ создания потока со стеком определенного размера по указанному адресу:

#include <pthread.h>

pthread_attr_t tattr;

pthread_t tid;

int ret;

void *stackbase;

int size = PTHREAD_STACK_MIN + 0x4000;

stackbase = (void *) malloc(size);

/* инициализация значениями по умолчанию */

ret = pthread_attr_init(&tattr);

/* установка размера стека */

ret = pthread_attr_setstacksize(&tattr, size);

/* установка базового адреса стека */

ret = pthread_attr_setstackaddr(&tattr, stackbase);

ret = pthread_create(&tid, &tattr, func, arg);

Функция pthread_attr_getstackaddr(pthread_attr_t *tattr,
void* *stackaddr)
используется для получения базового адреса стека текущего потока.



2004-06-22

АКЦИЯ! ПОДПИШИСЬ на журнал Linux Format до 31 января 2012 года и выиграй СУПЕРПРИЗ!

Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

Каждый, кто оформит подписку, получает бонус- объёмные наклейки на системный блок и подарки: с одним из первых выпусков журнала в 2012 году- диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

Подробнее о проведении акции вы можете прочитать на странице сайта.


  Закладки на сайте
  Проследить за страницей
Created 1996-2012 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
RUNNet TopList