Как проще всего создавать многопоточные приложения с помощью C / C++?

каков самый простой способ создания многопоточных приложений с помощью C / C++?

15 ответов


к сожалению, нет простого способа. Несколько вариантов: pthread в linux, win32 api threads в windows или boost:: библиотека потоков


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


просто упомянуть об этом, потому что это не было упомянуто: компилятор с поддержкой OpenMP (http://openmp.org/wp/)


Qt имеет довольно поддержка потоков и документация но, как предупреждали другие, это не для начинающих. Ссылка doc, которую я дал себе, указывает на краткий список для чтения



на это нет простого ответа. Это очень сильно зависит от того, что вы надеетесь получить от многопоточности, платформы/компилятора и какой модели потоков вы хотите использовать. Каждый API потоков имеет свои подводные камни.

и только потому, что никто не упомянул об этом до сих пор, OpenMP-это еще один вариант, который поддерживается во многих современных мейнстрим-компиляторах и предназначен для упрощения использования параллелизма. http://openmp.org/wp/


прошло некоторое время с тех пор, как я работал на C++, и я не видел Boost поддержка потоков, но я нашел очень полезным инкапсулировать семафор услуги, предоставляемые ОС, обычно либо POSIX или Win32, в простых классах, которые будут приобретать блокировки и освобождать их в деструкторах, что делает их использование довольно простым.

void operateOnSharedResource(SharableResource & foo) {
    MutexLock lock(foo.getMutex());
    // do stuff to foo
    // implicit call to MutexLock dtor performs release 
}

в конечном счете есть много простых трюков, таких как это, чтобы облегчить Программирование потоков, и я бы удивлен, если у Boost не было чего-то подобного (EDIT: это так, и это задокументировано в Типы Блокировки).

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

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

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


Я не уверен, о простой, но IMO самой удобной библиотекой потоков является та, которая включена в проект Poco C++. Для предварительного просмотра посмотрите на нить.h заголовочный файл.


на в C++0х спецификация включает в себя средства резьбы (один из моих любимая новые возможности). Скоро не будет иметь значения, для какой ОС вы компилируете! Просто посмотрите, как легко создать новый поток и присоединиться к потоку создателя:

#include <thread>
#include <iostream>

class SayHello
{
public:
    void operator()() const
    {
        std::cout<<"hello"<<std::endl;
    }
};

int main()
{
    std::thread t((SayHello()));
    t.join();
}

Visual Studio 2010 реализует части C++0x, но мы все еще ждем возможности потоковой передачи.


импульс.Нить относительно проще, потому что он портативный, хорошо документированный и имеет API высокого уровня, такой как scoped_try_lock.


кроме уже упомянутых, ACE - еще одна популярная и широко развернутая платформа C++, которая обеспечивает инкапсуляцию потоков на нескольких платформах. Это стиль C++ не так современен, как импульс.Нить, например, но он вполне зрелый.


Я бы сказал, с Qt. Потоки Qt и параллелизм Qt, вероятно, стоит поискать в гугле.


поток Posix довольно хорош, они также поставляются с отличной документацией и учебниками.

Не так просто, как Java-потоки, но все равно неплохо.


самый простой способ-избежать / минимизировать изменяемое общее состояние.

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


Это полностью зависит от того, что ты делаешь. Если вы можете поместить то, что вы делаете в OpenMP, то это путь. В противном случае вы можете посмотреть на TBB Intel. TBB предлагает несколько рабочих процессов, в которые вы должны быть в состоянии вписаться, но библиотека имеет двойную лицензию, и вы не можете принять ни одну лицензию. Если OpenMP и TBB отсутствуют,следует учитывать возможности пулов потоков операционной системы.

в какой-то момент вам может понадобиться стиснуть зубы и использовать импульс.Нитка. Если это так, вы хотите посмотреть что делает многопоточность в C++ hard (хорошо читать, даже если вы не используете C++0x: "это не сами потоки, это связь, которая вызывает проблемы. Изменяемое общее состояние вводит неявную связь", стр. 3).