Использование потоков в C ++ - PullRequest
6 голосов
/ 02 декабря 2008

Можете ли вы сказать мне, как я могу использовать потоки в программах на C ++ и как я могу скомпилировать их, так как они будут многопоточными? Можете ли вы сказать мне какой-нибудь хороший сайт, где я могу начать с root?

Спасибо

Ответы [ 7 ]

13 голосов
/ 02 декабря 2008

Я сам этим не пользовался, но мне сказали, что библиотеки потоков Boost делают это невероятно простым.

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

4 голосов
/ 02 декабря 2008

Для Unix / Linux / BSD есть pthread библиотека: учебник .

Я полагаю, что есть эквивалент в Win32 API.

3 голосов
/ 02 декабря 2008

Я использую класс tbb_thread из библиотеки Intel Threading Building Blocks.

1 голос
/ 02 декабря 2008

Существует множество библиотек потоков, совместимых с c ++. Поэтому сначала вы должны выбрать один. Я предпочитаю OpenMP или потоки POSIX (также известные как pthreads). Как его скомпилировать, зависит от выбранной вами библиотеки.

1 голос
/ 02 декабря 2008

Я пользуюсь библиотекой, которую написал мой университетский профессор. Он очень прост в реализации и работает очень хорошо (использовал его уже довольно давно). Я попрошу у него разрешения поделиться этим с вами.

Извините за ожидание, но нужно проверить:)

++++++ 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 включает в себя несколько классов, которые позволяют вам работать с процессами, потоками и другими методами параллельного программирования. Откройте для себя все остальное;)

0 голосов
/ 27 ноября 2015

Использование потоков в C / C ++:

#include <iostream>

using namespace std;

extern "C" 
{
     #include <stdlib.h>
     #include <pthread.h>
     void *print_message_function( void *ptr );
}


int main()
{
     pthread_t thread1, thread2;
     char *message1 = "Thread 1";
     char *message2 = "Thread 2";
     int  iret1, iret2;

     iret1 = pthread_create( &thread1, NULL, print_message_function (void*) message1);
     iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

     pthread_join( thread1, NULL);
     pthread_join( thread2, NULL); 

     //printf("Thread 1 returns: %d\n",iret1);
     //printf("Thread 2 returns: %d\n",iret2);
     cout<<"Thread 1 returns: %d\n"<<iret1;
     cout<<"Thread 2 returns: %d\n"<<iret2;

     exit(0);
}

void *print_message_function( void *ptr )
{
     char *message;
     message = (char *) ptr;
     //printf("%s \n", message);
     cout<<"%s"<<message;
}
0 голосов
/ 02 декабря 2008

Возможно, вы захотите прочитать мою предыдущую публикацию на SO.

(Оглядываясь назад, эта публикация немного односторонняя по отношению к pthreads. Но я парень из Unix / Linux. И этот подход показался мне лучшим по отношению к исходной теме.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...