потоки c ++ - параллельная обработка - PullRequest
2 голосов
/ 19 апреля 2011

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 19 апреля 2011

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

3 голосов
/ 19 апреля 2011

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

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

2 голосов
/ 19 апреля 2011

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

2 голосов
/ 19 апреля 2011

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

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

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

1 голос
/ 03 января 2017

Важным примечанием в 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, и в некоторых случаях могут лучше работать в различных средах ОС.

Для параллельно обработка , см. this .

1 голос
/ 19 апреля 2011

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

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

  • Mutex
  • Чтение и запись блокировки
  • Семафор
  • Условие ожидания
  • Хранилище, специфичное для потоков

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

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

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

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

Код Sameple:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...