Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Некоторые соображения по библиотеке С/С++ - часть 5


#ifdef _WIN32
wchar_t * _wnamebuf1; /* ptr ма буфер wTmpfi]e() */
#endif /* _WIN32 */

char * _asctimebuf; /* ptr на буфер asctime() */

#ifdef _WIN32
wchar_t * _wasctimebuf; /* ptr на буфер _wasctime() */
#endif /* _WIN32 */

void * _gmtimebuf; /* ptr на структуру gmtime() */
char * _cvtbuf; * /* ptr на буфер ecvt()/fcvt */

/* следующие поля используются кодом _beginthread */
void * _initaddr; /* начальный адррс пользовательское потока */
void * _initarg; /* начальный аргумент пользовательского потока */

/* следующие три поля нужны для поддержки функции signal и обработки ошибок, возникающих в период выполнения */

void * _pxcptaottab; /* ptr на таблицу исключение-действие */
void * _tpxcptaofoptrs; /* ptr на указагели к информации об исключении */
int _tfpecode; /* код исключения для операций над числами с плавающей точкой */

/* следующее поле нужно подпрограммам NLG */
unsigned long _NLG_dwCode;

/* данные для отдельного потока используемые при обработке исключений в С++ */

void * _terminate; /* подпрограмма terminate() */
void * _unexpected; /* подпрограмма unexpected() */
void * _translator; /* транслятор S E */
void * _curexception; /* текущее исключение */
void * _curcontext; /* контекст текущего исключения */

#if defined (_M_MRX000)
void * _pFrameInfoChain;
void * _pUnwindContext;
void * _pExitContext,
int _MipsPtdDelta;
int _MipsPtdEpsilon;
#elif defined (_M_PPC)
void * __pExitContext;
void * _pUnwindContext;
void * _pFrameInfoChain;
int _FrameInfo[6];
#endif /* defined (_M_PPC) */

};

typedef struct _tiddata * _ptiddata;

Рис. 6-2. Локальная структура tiddata потока, определенная в библиотеке С/С++

Выяснив, как создается и инициализируется структура tiddata для нового потока, посмотрим, как она сопоставляется с этим потоком Взгляните на исходный код фун кции _threadstartex (который тоже содержится в файле Threadex с библиотеки С/С++) Вот моя версия этой функции в псевдокоде

static unsigned long WINAPI threadstartex (void* ptd)
{

// Примечание ptd - это адрес блока tiddata данного потока



Начало  Назад  Вперед