Создание потоков средствами C++
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Создание потоков средствами 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(). Но в большенстве случаев его использовать не обязательно, так как после окончания потока управление само передастся главной задаче.
|
|
|
RE: Создание потоков средствами C++ - 2010-07-18 20:43:40.886666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
А какое отношение WinAPI имеет к С++?
|
|
|
RE: Создание потоков средствами C++ - 2010-07-18 21:03:39.800000
|
|
|
hromjo
Сообщений: 434
Оценки: 0
Присоединился: 2009-12-31 15:42:15.823333
|
Никакого. Просто я сравнил в каких случаях это выгоднее, чем с CreateThread(). Или ты про что?
|
|
|
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 не гарантирована.
|
|
|
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 из соображений производительности
|
|
|
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 заюзать - сразу заодно и потокобезопасную реализацию делать.
|
|
|
RE: Создание потоков средствами C++ - 2010-07-22 16:28:44.986666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Тестируешь? На производительности/переносимости не сказывается? :)
|
|
|
|
|