Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Создание потоков средствами C++

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Создание потоков средствами C++
Имя
Сообщение << Старые топики   Новые топики >>
Создание потоков средствами C++ - 2010-07-18 19:42:31.646666   
hromjo

Сообщений: 434
Оценки: 0
Присоединился: 2009-12-31 15:42:15.823333
Создание потоков средствами C++

Знаю что статья фигня, кому не нравится говорите, нахрен удалю. Просто может кому-то поможет(уже стихами говорю ;))

Сегодня я хотел бы рассказать как собственно создавать потоки функциями _beginthread и _beginthreadex. Чем же лучше использование этих функций в замен стандартных средств из winapi?

Начну с того, что они позволяют использовать внутри потока все средства CRT-библиотеки, говоря простым языком, то можно использовать функции C++ такие как cout, fprint и т.д. В случае с CreateThread, которую рассматривать я не буду, можно использовать только WinApi средства.

Для начала рассмотрим прототип первой функции:

uintptr_t _beginthread(
void( *start_address )( void * ),
unsigned stack_size,
void *arglist
);

Первый аргумент это указатель на функцию, которая является точкой входа для самого потока. Сама функция должна выглядеть как:

void myThread(void* pParams)
{
. . .
}

Имя конечно же может быть любое.

Второй аргумент это начальный размер стека. Почти в любом случае его можно указать как 0. Тогда размер стека будет равен тому же, что и у главной задачи процесса.

С третьим все ещё легче, это аргументы функции потока, которые вполне могут быть как NULL. Или же выглядеть как (void*)(pParam) в случае с первой функцией.

Для полности приведу пример, который выводит 100 раз цифру 1 и 100 раз цифру 2.

#include <iostream>
#include <process.h>

void myThread(void* pParams)
{
for(int f=0;f<=100;f++){
std::cout << “1″;
}
_endthread();
}

int main()
{
_beginthread(myThread, 0, NULL);
for(int q=0;q<=100;q++){
std::cout << “2″;
}

system(“PAUSE”);
}

Теперь пора перейти к более функциональному собрату первой _beginthreadex. Она нужна в случае если вам понадобится в дополнение и возможности CreateThread. К примеру приостановление потока, чего нету в обычной _beginthread. Посмотрим на прототип:

unsigned long _beginthreadex(
void *Security,
unsigned StackSize,
unsigned (*StartAddress)(void*),
void *ArgList,
unsigned Initflag,
unsigned *ThrdAddr);

Теперь посмотрим на её аргументы:

Первый это указатель на дескриптор защиты. К сожалению это уже другой разговор и его я рассматривать не буду.

Второй аргумент это адрес стека. О нем речь шла ещё в первой функции.

Третий – сама функция задачи потока. О её уже было опять же рассказано в первой функции.

Четвертый – тоже уже было. см. _beginthread.

Пятый – это уже интереснее. Он используется для установки параметров задачи. Например если вы хотите создать поток в приостановленном состояние, то вам нужно установить параметр CREATE_SUSPENDED. Если не нужен можно поставить 0.

Ну и последний это адрес создания задачи.

Для выхода из потока используется _endthread(). Но в большенстве случаев его использовать не обязательно, так как после окончания потока управление само передастся главной задаче.
Post #: 1
RE: Создание потоков средствами C++ - 2010-07-18 20:43:40.886666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А какое отношение WinAPI имеет к С++?
Post #: 2
RE: Создание потоков средствами C++ - 2010-07-18 21:03:39.800000   
hromjo

Сообщений: 434
Оценки: 0
Присоединился: 2009-12-31 15:42:15.823333
Никакого. Просто я сравнил в каких случаях это выгоднее, чем с CreateThread(). Или ты про что?
Post #: 3
RE: Создание потоков средствами C++ - 2010-07-18 22:51:00.096666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Преимуществ абсолютно никаких. То, что ты назвал якобы преимуществом решается с помощью функции SuspendThread. Гугл в помощь. Вызовы CRT-шной _beginthread (и прочих) - это лишь копмиляторозависимые обвёртки для CreateThread.

Теперь то, что является откровенным бредом:
quote:

после окончания потока управление само передастся главной задаче

Что такое "главная задача"? И с чего ты взял, что после завершения потока что-то куда-то передаётся?

quote:

они позволяют использовать внутри потока все средства CRT-библиотеки, говоря простым языком, то можно использовать функции C++ такие как cout, fprint и т.д. В случае с CreateThread, которую рассматривать я не буду, можно использовать только WinApi средства.

Использование cout (и прочих) никак не зависит от того, как и кто создал поток. Если не ошибаюсь (денатурат пусть поправит), то потокобезопастность в STL не гарантирована.
Post #: 4
RE: Создание потоков средствами C++ - 2010-07-18 23:41:56.410000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: _SaZ_

Использование cout (и прочих) никак не зависит от того, как и кто создал поток. Если не ошибаюсь (денатурат пусть поправит), то потокобезопастность в STL не гарантирована.


не гарантирована. большинство реализаций STL не thread-safe из соображений производительности
Post #: 5
RE: Создание потоков средствами C++ - 2010-07-19 02:26:56.010000   
ghostonline

Сообщений: 228
Оценки: 0
Присоединился: 2008-12-17 08:34:55.816666
quote:

ORIGINAL: Denaturat

quote:

ORIGINAL: _SaZ_

Использование cout (и прочих) никак не зависит от того, как и кто создал поток. Если не ошибаюсь (денатурат пусть поправит), то потокобезопастность в STL не гарантирована.


не гарантирована. большинство реализаций STL не thread-safe из соображений производительности

Ога, да.
Для себя выработал правило - пишу код который могу over 9000 заюзать - сразу заодно и потокобезопасную реализацию делать.
Post #: 6
RE: Создание потоков средствами C++ - 2010-07-22 16:28:44.986666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Тестируешь? На производительности/переносимости не сказывается? :)
Post #: 7
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Создание потоков средствами C++







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.