потоки С++ - параллельная обработка

Мне было интересно, как выполнить два процесса в двухъядерном процессоре на С++.

Я знаю, что потоки (или многопоточность) не являются встроенной функцией С++.

В Qt есть поддержка потоков, но я ничего не понял из их ссылки. :(

Итак, кто-нибудь знает простой способ для новичка сделать это. Кроссплатформенная поддержка (например, Qt) была бы очень полезна, так как я работаю в Linux.


person Kid Green    schedule 19.04.2011    source источник


Ответы (6)


Попробуйте многопоточность в C+ +0x часть 1: запуск потоков как 101. Если у вашего компилятора нет C ++0x, тогда оставайтесь с Boost.Thread

person dubnde    schedule 19.04.2011

Взгляните на Boost.Thread. Это кроссплатформенная и очень хорошая библиотека для использования в ваших приложениях на C++.

Что конкретно вы хотели бы узнать?

person murrekatt    schedule 19.04.2011

Библиотека потоков POSIX (pthreads), вероятно, является лучшим выбором, если вам просто нужна простая библиотека потоков, она имеет реализации как для Windows, так и для Linux.

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

Редактировать: не видел, что вы были в Linux. В этом случае я не уверен на 100%, но я думаю, что библиотеки, вероятно, уже включены в вашу установку GCC.

person Rune Aamodt    schedule 19.04.2011

Я рекомендую использовать библиотеки Boost Boost.Thread. вместо. Это уберет особенности платформы Win32 и Posix и даст вам надежный набор объектов потоковой передачи и синхронизации. Он также очень интенсивно используется, поэтому легко найти помощь по любым вопросам, с которыми вы сталкиваетесь на SO и других сайтах.

person holtavolt    schedule 19.04.2011
comment
+1: это включено в С++ 0x, поэтому оно также должно быть ориентировано на будущее. - person rubenvb; 19.04.2011

Вы можете найти бесплатную книгу в формате PDF "C++-GUI-Programming-with-Qt-4-1st-ed.zip" и прочитать главу 18 о многопоточности в Qt.

Функции параллельного программирования, поддерживаемые Qt, включают (не ограничиваясь) следующее:

  • Мьютекс
  • Блокировка чтения и записи
  • семафор
  • Условие ожидания
  • Хранилище для конкретного потока

Однако имейте в виду следующие компромиссы с Qt:

  • Снижение производительности по сравнению с собственными библиотеками потоков. Поток POSIX (pthreads) является родным для Linux, начиная с ядра 2.4, и не может заменить ‹ process.h > в W32API во всех ситуациях.
  • Взаимодействие между потоками в Qt реализовано с помощью конструкций SIGNAL и SLOT. Они НЕ являются частью языка C++ и реализованы в виде макросов, которые требуют полной компиляции проприетарных генераторов кода, предоставляемых Qt.

Если вы можете жить с вышеуказанными ограничениями, просто следуйте этим рецептам использования QThread:

  1. #include ‹ QtCore >
  2. Получите свой собственный класс от QThread. Вы должны реализовать общедоступную функцию run(), которая возвращает void, чтобы содержать инструкции для выполнения.
  3. Создайте свой собственный класс и вызовите start(), чтобы запустить новый поток.

Тот же код:

#include <QtCore>

class MyThread : public QThread {
public:
    void run() {
        // do something
    }
};

int main(int argc, char** argv) {
    MyThread t1, t2;
    t1.start(); // default implementation from QThread::start() is fine
    t2.start(); // another thread
    t1.wait();  // wait for thread to finish
    t2.wait();
    return 0;
}
person user715213    schedule 19.04.2011

Важно отметить, что в c++14 доступно использование параллельного потока:

#include<thread>

class Example
{
  auto DoStuff() -> std::string
  { 
    return "Doing Stuff";
  }

  auto DoStuff2() -> std::string
  {
    return "Doing Stuff 2";
  }
};

int main() 
{
  Example EO;
  std::string(Example::*func_pointer)();
  func_pointer = &Example::DoStuff;
  std::future<string> thread_one = std::async(std::launch::async, func_pointer, &EO); //Launching upon declaring

  std::string(Example::*func_pointer_2)();
  func_pointer_2 = &Example::DoStuff2;
  std::future<string> thread_two = std::async(std::launch::deferred, func_pointer_2, &EO);
  thread_two.get(); //Launching upon calling
}

И std::async (std::launch::async, std::launch::deferred), и std::thread полностью совместимы с Qt и в некоторых случаях могут лучше работать в разных средах ОС.

Для параллельной обработки см. это.

person Babra Cunningham    schedule 03.01.2017