Легкий портативный C ++ Threading - PullRequest
9 голосов
/ 15 ноября 2010

Кто-нибудь знает о легкой переносимой библиотеке потоков C ++, которая может работать в Windows, Linux и Mac OS X?

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

Спасибо

Ответы [ 6 ]

14 голосов
/ 15 ноября 2010

А как насчет TinyThread ++ ?

Вам нужны переносимые потоки для вашего приложения C ++?C ++ 0x недоступен для вашего целевого компилятора (ов)?Boost слишком велик?

Тогда вам нужен TinyThread ++!

TinyThread ++ реализует довольно совместимое подмножество классов управления потоками C ++ 0x.

12 голосов
/ 15 ноября 2010

Я использую Boost.Thread и рекомендую его другим.

Он переносим практически на все и прост в использовании.«Легкая» вещь - единственный вопрос, так как я не совсем уверен, что это значит.Boost облегчен тем, что его использование почти не требует дополнительных затрат, так как все функции многопоточности - это слабая статическая упаковка для базовой библиотеки многопоточности (pthreads, Win32 API, Cell BE и т. Д.).«Мьютекс» - это на самом деле все, что реализует эту концепцию «блокировки» (см. документация ), которая может быть чем угодно - даже вашим собственным специальным назначением.В этом смысле он очень легкий и расширяемый.

Однако , Boost - это огромная библиотека, и вытащить только те ее части, которые вам нужны, может быть очень больно (это обычная жалоба на Boost в целом).Вдобавок ко всему, использование Boost.Thread означает, что у вас должны быть Boost.DateTime, Boost.System, Boost.ConceptCheck и Boost.Compiler (и, вероятно, больше и все, на что они полагаются и т. Д.).К их чести, очень легко создать то, что вам нужно, если у вас есть целая библиотека из-за их волшебства автоматического связывания, но необходимость иметь все это, безусловно, нужно учитывать, особенно если Windows находится в списке целей.

В качестве альтернативы Boost, я бы порекомендовал OpenMP , предполагая, что ваш компилятор поддерживает его.Тот факт, что он требует поддержки компилятора для некоторых более продвинутых функций, может дисквалифицировать его на «легковесной» вещи, но он довольно легок в использовании (первый раз, когда вы #pragma omp parallel for будете довольно аккуратны).Он не такой функциональный, как Boost (я думаю, что здесь может конкурировать только Qt), но использование OpenMP дает вам действительно классные функции, которые не может сделать ни одна другая библиотека потоков.Вам придется использовать несколько современный компилятор, но и GCC, и MSVC имеют здесь хорошую поддержку.Одно предостережение в том, что это действительно библиотека C, что я считаю недостатком, если вы работаете с C ++, но это может быть полезно для ваших требований.

Если вы ищете что-то значительно большеелегкий (в обоих смыслах этого слова), тогда я бы порекомендовал OpenThreads .Он далеко не такой расширяемый, как Boost, и он менее производительный (хотя и незначительный), он довольно хорошо разработан и заслуживает упоминания.Он поразит все ваши указанные цели (Windows, OSX и Linux), поэтому, если у него есть нужные функции, перейдите к нему.

Также, Википедия .

2 голосов
/ 15 ноября 2010

Boost.Thread будет работать здесь.

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

Существуют другиеПримеры кода в документации, но запуск потока выглядит так:

struct callable
{
    void operator()();
};

boost::thread copies_are_safe()
{
    callable x;
    return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK

boost::thread oops()
{
    callable x;
    return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
  // this leads to undefined behaviour
2 голосов
/ 15 ноября 2010

Boot.Thread - это то, что вы ищете.Цитировать его описание на страницах документации Boost

Портативная многопоточность C ++.

0 голосов
/ 28 февраля 2017

Я использую стандарт C ++ 11 для потоков, чтобы создать класс многопоточности, и он работает для Linux, Windows и OS X, возможно, его можно использовать полностью:

https://github.com/jorgemedra/C-11-Threads/blob/master/README.md

0 голосов
/ 16 ноября 2010

Я в основном слышал о Boost. Thread, который может быть довольно тяжелым, Poco. Thread, который должен быть легким, и Intel TBB, который я не знаю, как он работает.

Я немного поэкспериментировал с C ++ 0x, но мне сказали, что он еще недостаточно зрел для сложных реализаций.

...