Я пользуюсь библиотекой, которую написал мой университетский профессор. Он очень прост в реализации и работает очень хорошо (использовал его уже довольно давно). Я попрошу у него разрешения поделиться этим с вами.
Извините за ожидание, но нужно проверить:)
++++++ EDIT +++++++
Хорошо, я поговорил со своим профессором, и он не возражает, если я поделюсь этим здесь. Ниже приведены файлы .h и .cpp для «Библиотеки RT», написанные Полом Дэвисом
http://www.filefactory.com/file/7efbeb/n/rt_h
http://www.filefactory.com/file/40d9a6/n/rt_cpp
Некоторые замечания по поводу потоков и использования этой библиотеки:
0) В этом руководстве объясняется создание и использование потоков на платформе Windows.
1) Потоки в c ++ обычно кодируются как часть одного и того же источника (в отличие от процессов, где каждый процесс имеет свой собственный исходный файл и функцию main ())
2) Когда процесс запущен и работает, он может создавать другие потоки, делая соответствующие вызовы ядра.
3) Несколько потоков работают быстрее, чем несколько процессов, поскольку они являются частью одного и того же процесса, что приводит к уменьшению нагрузки на ОС и снижению требований к памяти.
4) В вашем случае вы будете использовать класс CThread в библиотеке rt.
5) (Убедитесь, что rt.h и rt.cpp являются частью вашего «решения» и обязательно включите rt.h в ваш main.cpp)
6) Ниже приведен фрагмент кода из вашего будущего основного потока (конечно, в main.cpp), где вы создадите поток с использованием класса CThread.
void main()
{
CThread t1(ChildThread1, ACTIVE, NULL) ;
. . .
t1.WaitForThread() ; // if thread already dead, then proceed, otherwise wait
}
Аргументы t1 в следующем порядке: имя функции, выполняющей роль нашего потока, состояние потока (может быть либо ACTIVE, либо SUSPENDED - в зависимости от того, что вы хотите), и, наконец, указатель на необязательный данные, которые вы, возможно, захотите передать потоку при создании. После того, как вы выполните некоторый код, вы захотите вызвать функцию WaitForThread ().
7) Ниже приведен фрагмент кода из вашего будущего основного потока (конечно, в main.cpp), где вы опишите, что делает дочерний поток.
UINT _ _stdcall ChildThread1(void *args)
{
. . .
}
Странно выглядит подпись нити Microsoft. Я уверен, что после небольшого исследования вы сможете выяснить, как это сделать в других ОС. Аргументом являются необязательные данные, которые могут быть переданы дочернему элементу при создании.
8) Подробное описание функций-членов можно найти в файле rt.cpp. Вот резюме:
CThread () - Конструктор, отвечающий за создание потока
Suspend () - приостанавливает дочерний поток, эффективно останавливая его.
Resume () - пробуждает приостановленную дочернюю нить
SetPriority (int value) - изменяет приоритет дочернего потока на значение
указанный
Post (int message) - отправляет сообщение в дочернюю ветку
TerminateThread () - Завершает или убивает дочерний поток
WaitForThread () - приостанавливает родительский поток, пока дочерний поток не завершится.
Если дочерний поток уже завершен, родительский процесс не будет приостановлен
9) Ниже приведен пример примера полной программы. Умная вещь, которую вы можете сделать, - создать несколько экземпляров одного потока.
#include “..\wherever\it\is\rt.h” //notice the windows notation
int ThreadNum[8] = {0,1,2,3,4,5,6,7} ; // an array of thread numbers
UINT _ _stdcall ChildThread (void *args) // A thread function
{
MyThreadNumber = *(int *)(args);
for ( int i = 0; i < 100; i ++)
printf( "I am the Child thread: My thread number is [%d] \n", MyThreadNumber) ;
return 0 ;
}
int main()
{
CThread *Threads[8] ;
// Create 8 instances of the above thread code and let each thread know which number it is.
for ( int i = 0; i < 8; i ++) {
printf ("Parent Thread: Creating Child Thread %d in Active State\n", i) ;
Threads[i] = new CThread (ChildThread, ACTIVE, &ThreadNum[i]) ;
}
// wait for threads to terminate, then delete thread objects we created above
for( i = 0; i < 8; i ++) {
Threads[i]->WaitForThread() ;
delete Threads[i] ; // delete the object created by ‘new’
}
return 0 ;
}
10) Вот и все! Библиотека rt включает в себя несколько классов, которые позволяют вам работать с процессами, потоками и другими методами параллельного программирования. Откройте для себя все остальное;)