Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> К вопросу о реентерабельных функциях: и многопоточности 
V
    Опции темы
EnergoHokum
Дата 18.2.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Сейчас переписываю свои старые коды, писалось на "C", достаточно много глобальных переменных и прочего, что делает невозможным использовать их в многопоточных приложениях. Почитал про условия реентерабельности, и подумалось: будет-ли функция, использующая глобальные переменные реентерабельной, если эти переменные избавить от static-ности, собрать в структуру и передавать функции указатель на неё? Разумеется, перед использованием этой функции нужно будет создать экземпляр структуры. Вот код для иллюстрации:
Код

//Non-reentrant
#include <stdio.h>

fpos_t char_in_file=0;
FILE* file=NULL;

fpos_t get_CIF(IN char* filename)
{
    if((file=fopen(filename,"rb")) == NULL)
        return -1;
    fseek(file,0,SEEK_END);
    return fgetpos(file,&char_in_file);
}

int main(int argc,char** argv)
{
    fpos_t CIF;
    if((CIF=get_CIF("./file.txt")) < 0)
        return -1;
    printf("CIF=%li\n",CIF);
        return 0;
}


Код

//Reentrant

#include <stdio.h>

struct ProgContext
{
    fpos_t char_in_file;
    FILE* file;
};

fpos_t get_CIF(IN ProgContext* ppc,IN char* filename)
{
    if((ppc->file=fopen(filename,"rb")) == NULL)
        return -1;
    fseek(ppc->file,0,SEEK_END);
    return fgetpos(ppc->file,&ppc->char_in_file);
}

int main(int argc,char** argv)
{
    ProgContext pc;
    pc.file=NULL;
    pc.char_in_file=0;
    fpos_t CIF;
    if((CIF=get_CIF(&ppc,"./file.txt")) < 0)
        return -1;
    printf("CIF=%li\n",CIG);
        return 0;
}


ВотЪ, что-то в этом роде...

Это сообщение отредактировал(а) EnergoHokum - 18.2.2008, 12:43
PM MAIL ICQ   Вверх
MAKCim
Дата 18.2.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(EnergoHokum @  18.2.2008,  12:42 Найти цитируемый пост)
будет-ли функция, использующая глобальные переменные реентерабельной, если эти переменные избавить от static-ности, собрать в структуру и передавать функции указатель на неё? Разумеется, перед использованием этой функции нужно будет создать экземпляр структуры. Вот код для иллюстрации:

да
как вариант, можно использовать TLS


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 18.2.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



А напомни, пжалста, что такое этот TLS, а то кроме Transport Layer Securit в голову ничего не приходит?
PM MAIL ICQ   Вверх
MAKCim
Дата 18.2.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(EnergoHokum @  18.2.2008,  12:51 Найти цитируемый пост)
А напомни, пжалста, что такое этот TLS, а то кроме Transport Layer Securit в голову ничего не приходит? 

Thread Local Storage

Добавлено через 5 минут и 33 секунды
Код

#if defined __WINDOWS__
#define __TLS __declspec(thread)
#elif defined __LINUX__
#define __TLS __thread
#else
#error
#endif

static __TLS int count;

int get() {
    return count; /* возврат count текущего потока */
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
EnergoHokum
Дата 18.2.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



То есть, несмотря на static значение count для каждого потока будет своё?
PM MAIL ICQ   Вверх
EnergoHokum
Дата 18.2.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Всем спасибо, вопрос закрыт (буду проверять на практике).
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.