Многопоточность в C ++ ... с чего начать? - PullRequest
14 голосов
/ 26 июня 2010

Я бы хотел начать изучать многопоточность на C ++. Я учу это и на Java. В Java, если я напишу программу, которая использует многопоточность, она будет работать где угодно. Однако в C ++ многопоточность не опирается на специфичные для платформы API? Если это так, то это может помешать переносимости.

Как я могу выполнять многопоточность в C ++, не вызывая проблем с переносимостью? Является ли библиотека thread boost хорошим решением?

Как примечание - как вообще возможно реализовать многопоточность как библиотеку? Разве это не должно быть сделано компилятором?

Ответы [ 10 ]

15 голосов
/ 26 июня 2010

Если у вас еще нет компилятора, который поддерживает C ++ 0x (например, доступен с Visual Studio C ++ 2010), используйте потоки повышения.(Если вы не используете фреймворк, который уже поддерживает многопоточность, а это не так - вы бы не задали вопрос иначе).Эти повышающие темы стали фактически стандартом в новом C ++.До того времени сам C ++ не знал о потоке.

Строительные блоки потоков TBB также могут быть вам интересны, если вы хотите изучить другие аспекты параллельного программирования.

Относительно Qt: если вам нужна только поддержка потоков, это полное излишество.У него ужасно медленное время прохождения туда-обратно от компиляции до результата.Это действительно хорошо продуманная мысль.Но не официальный стандарт, как потоки C ++ 0x от boost.Поэтому я бы не стал воспринимать это как первый выбор.

4 голосов
/ 26 июня 2010

Давайте начнем назад:

Как реализовать потоки в библиотеке?

Это не так, по крайней мере, в (чистом) C ++. Для этого требуется поддержка language (компилятор - только реализация).

На данный момент используются 2 вещи:

  • код сборки для некоторых деталей (как в библиотеке pthread)
  • специальные инструкции компилятора для других (зависит от компилятора и платформы)

Оба являются хрупкими и требуют огромного количества работы для переносимости. По сути, это означает, что в коде нужно много #ifdef частей для тестирования компилятора и целевой архитектуры, проверки поддержки некоторых директив и т. Д ...

Именно поэтому было сочтено необходимым добавить поддержку потоков в C ++ 0x.

Как мне сделать многопоточность?

Даже перед тем, как выбрать библиотеку, вы должны выбрать метод. Есть 2 способа программирования многопоточных приложений (и вы можете комбинировать их):

  • Общение с помощью общего доступа : это означает использование мьютексов, атомарных операций и т. Д. ... вы можете использовать pthread на платформах Linux, но я бы порекомендовал Boost.Thread (среди прочих) для его переносимости.
  • Обмен информацией через общение : более новый и адаптированный к распределенным вычислениям, это происходит из функциональных языков. Это означает передачу сообщений из одного потока в другой и не совместное использование каких-либо ресурсов. Вы можете использовать FastFlow или Intel Thread Building Blocks aka TBB.

Вы можете, возможно, объединить два, но было бы лучше не делать этого. Лично я нашел описание FastFlow совершенно потрясающим: оно поощряет программирование без блокировок. Кроме того, основным преимуществом второго метода является то, что он лучше адаптирован к многопроцессорному программированию и масштабируется в распределенных средах.

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

4 голосов
/ 26 июня 2010

В C ++ да многопоточность зависит от платформы.Тем не менее, многие библиотеки многопоточности инкапсулируют нюансы многопоточности на различных платформах, предоставляя единый API для написания вашего многопоточного приложения, так что вам не нужно беспокоиться о деталях, специфичных для платформы.очень хорошее решение.

Я также рекомендую проверить ACE .

2 голосов
/ 31 января 2013
//This program explains how pthread works, here 5 thread are trying to update a global variable simultaneously but with locking synchronization in maintained
#include<iostream>
#include<pthread.h>
using namespace std ;

#define MAX_NO_THREAD 5

    int global_sum = 0 ;
    pthread_mutex_t lock ;    //Declared global lock mutex object

void *print_fun(void *arg)
{
    cout<<"\nThread id : "<<(int)arg;
    pthread_mutex_lock(&lock) ; //aquiring lock on piece of code
    for ( int j=0; j<100000000; j++)
    {
        global_sum++ ;
    }
    pthread_mutex_unlock(&lock) ; //reomving lock on peice of code
    cout<<"\nGlobal Sum : "<<global_sum ;
}

int main()
{
    int i = 0 ;
    pthread_t threads_obj[MAX_NO_THREAD] ; //Initializing object array for thread
    pthread_mutex_init(&lock, NULL) ; //Initalinzing lock object for thread
    int st ;
    for ( i=0; i<5; i++)
    {
        pthread_create(&threads_obj[i], NULL, *print_fun, (void *)i) ;//Initializing threads calling function print_fun
        pthread_join(threads_obj[i], 0) ; //Forcing main thread to main until these thread complete
    }
    pthread_mutex_destroy(&lock) ; //Destroying lock object
}



//compile this program using -lpthread option with g++
//g++ thread.cc -lpthread
1 голос
/ 06 сентября 2018

В C ++ 11 под заголовком <thread> введена «Библиотека поддержки потоков».

Более подробную информацию можно найти по ссылкам ниже

https://en.cppreference.com/w/cpp/thread

http://www.cplusplus.com/reference/thread/

1 голос
/ 27 июня 2010

Boost Threading Library, пожалуй, лучшее место для запуска на C ++.Дает вам многопоточные контуры, а также все мьютексы и управляющие объекты, необходимые для написания реально работающего многопоточного приложения.

1 голос
/ 26 июня 2010

вы также можете рассмотреть openmp http://openmp.org. Многие компиляторы поддерживают его, включая MS, GCC / G ++ и Intel.Хотя вы не получаете явного контроля над потоками, его абстракция параллелизма более высокого уровня иногда более эффективна (как во время кодирования, так и во время выполнения), и код намного проще для понимания.Это не очень поможет, если вы работаете с графическим интерфейсом, но для масштабируемых вычислений стоит посмотреть.

1 голос
/ 26 июня 2010

Чтобы предложить предложение, отличное от Boost, я использую Pthreads (или Pthreads-Win32 в Windows).Это очень простая библиотека, но предоставляет вам все, что вам нужно, и ничего больше.Он очень легкий по сравнению с Boost, и вы можете легко найти обертки C ++ вокруг него, чтобы предоставить вам абстракции более высокого уровня.

1 голос
/ 26 июня 2010

также проверить Qt

0 голосов
/ 27 июня 2010

Если вы делаете это из интереса, чтобы улучшить свои знания о различных моделях программирования и языковых навыках, тогда библиотека Boost была бы хорошим вариантом. Однако я думаю, долго и упорно о деле строительства каких-либо производственных приложений с использованием многопоточной C ++.

C ++ порой достаточно сложен, чтобы достичь корректности, не добавляя при этом значительной сложности многопоточности разделяемой памяти. Даже самые опытные программисты согласятся с тем, что многопоточные программы чрезвычайно трудно рассуждать и получать правильные результаты. Даже самые простые программы могут быстро стать трудными для тестирования и отладки при многопоточности.

Обязательные языки, такие как C ++ или Java или C # (с их изменяемыми переменными, разделяемой памятью и примитивами блокировки / сигнализации), зачастую являются наименее доступным способом создания многопоточных приложений. Обычно для решения большинства проблем пользовательского пространства (в отличие от ядра или встраиваемых приложений), в том числе на многоядерных машинах, обычно предлагаются отличные однопоточные варианты реализации.

Если вы действительно хотите создавать надежные «многопоточные» приложения, я бы посоветовал вам проверить функциональные языки, такие как Erlang, Haskell, F # или Clojure.

...