Форум программистов, компьютерный форум CyberForum.ru

Threads - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
17.10.2011, 22:10     Threads #1
Недавно начал изучать многопоточность. Нашёл функцию
C++
1
2
3
4
5
6
7
8
 uintptr_t _beginthreadex( // NATIVE CODE
   void *security,
   unsigned stack_size,
   unsigned ( __stdcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr 
);
Вроде всё понятно, но возникли вопросы:
1. Точка входа в поток возвращает unsidned. Куда это значение передаётся, то есть как его получить?
2. Последний параметр unsigned *thrdaddr, как я понял, являестся указателем, по которому записывается какой-то id потока. Зачем он нужен? У нас ведь есть уже дескриптор потока, который возвращает _beginthreadex()?
3. Функция _endthreadex(unsigned retval) принимает параметр. Это, как я понял, код выхода из потока. Это то-же самое, что и возвращает функция - точка входа в поток? Зачем он нужен и как его получить извне?

Добавлено через 35 минут
Да, ещё, зачем нужна структура *security? Я её просто устанавливал в 0.

Добавлено через 4 минуты
В MSDN эта структура описана так:
C++
1
2
3
4
5
typedef struct _SECURITY_ATTRIBUTES {
  DWORD  nLength;
  LPVOID lpSecurityDescriptor;
  BOOL   bInheritHandle;
}
Когда я стал разбирать её поля, то толком не понял (кроме первого поля - длины). Например, про поле bInheritHandle говорится, что оно отвечает за какое-то наследование дескриптора...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Revol'veR
 Аватар для Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
17.10.2011, 22:23     Threads #2
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
unsidned.
unsidned и sidned - это модификаторы, они изменяют формат представления данных, но не влияют на размеры выделяемых областей памяти.
Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения.
Модификатор типа unsigned указывает, что переменная принимает неотрицательные значения

Соответственно, используем ,unsigned, так как параллелизм добавляется инкрементально, а нити - это вроде как и есть наши перменные(нити, процессы)
PS. Говорю как знаю, только учусь. Приходится гуглить много.
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
18.10.2011, 14:40  [ТС]     Threads #3
Revol'veR, про unsigned и signed я знаю. В вопросе я имел в виду вот что: в этой строчке "unsigned ( __stdcall *start_address )( void * )" описыввается указатель на функцию, которая возвращает некоторое значение. Его тип в принципе мне не очень важен (он unsigned). Это значит, что где-то в функции должна быть строчка "return x", где x - значение или переменная нужного типа. Так вот, мне интересно, куда после завершения функции "return" оно попадает, то есть как в потоке, который вызвал дочерний поток функцией _beginthreadex, его получить? У меня есть предположение, что это код завершения потока...
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
18.10.2011, 15:03     Threads #4
Конкретно для _beginthreadex в msdn написано отличие от _beginthread:
The routine at start_address passed to _beginthreadex must use the __stdcall calling convention and must return a thread exit code.
Перевести надо?

Добавлено через 8 минут
Кстати, там же написано, что при завершении процедуры _endthreadex вызывается автоматически, так что достаточно будет просто закрыть хэндл
C++
1
CloseHandle(hThread);
Yandex
Объявления
18.10.2011, 15:03     Threads
Ответ Создать тему
Опции темы

Текущее время: 11:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru