Выполнение программы в нескольких потоках

Рейтинг: 0Ответов: 2Опубликовано: 15.04.2011

Хочу написать программу (любую выполняющую какие-либо арифметический действия), но мне нужно, чтобы она выполнялась в нескольких потоках. Подскажите пожалуйста какие стандартные библиотеки есть в С++ (есть ли вообще). И небольшой пример их использования.

Ответы

▲ 6Принят

В boost-е есть библиотека для работы с потоками. Большим плюсом является то, что она кроссплатформенная. Документация тут. Пример простой программы запускающей один thread:

#include <iostream>  
#include <boost/thread.hpp>  
#include <boost/date_time.hpp>

void workerFunc()  
{  
    boost::posix_time::seconds workTime(3);

    std::cout << "Worker: running" << std::endl;

    // Pretend to do something useful...  
    boost::this_thread::sleep(workTime);

    std::cout << "Worker: finished" << std::endl;  
}

int main(int argc, char* argv[])  
{  
    std::cout << "main: startup" << std::endl;

    boost::thread workerThread(workerFunc);

    std::cout << "main: waiting for thread" << std::endl;

    workerThread.join();

    std::cout << "main: done" << std::endl;

    return 0;  
}

Пример с использованием группы потоков и захватом mutex-а:

#include <iostream>  
#include <boost/thread.hpp>
#include <boost/bind.hpp>

void print(int* arr, int from, int to) {
    static boost::mutex ioMutex;
    for (int i = from; i < to; ++i) {
        boost::mutex::scoped_lock l(ioMutex);
        std::cout << arr[i] << std::endl;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    boost::thread_group g;
    g.create_thread(boost::bind(print, arr, 0, 4));
    g.create_thread(boost::bind(print, arr, 4, 8));
    g.join_all();
    return 0;
}
▲ 3

openmp тут на хабре есть пример:

http://habrahabr.ru/blogs/cpp/71296/

UPD:

#include <omp.h>
#include <stdio.h> 
int main(int argc, char **argv){
  int i;

  #pragma omp parallel for
  for (i = 0; i < 10; i++)
     printf("t#: %i  i: %i\n", omp_get_thread_num(), i);

}

на выходе:

t#: 2  i: 6
t#: 2  i: 7
t#: 2  i: 8
t#: 3  i: 9
t#: 0  i: 0
t#: 0  i: 1
t#: 0  i: 2
t#: 1  i: 3
t#: 1  i: 4
t#: 1  i: 5