Простой пример streamовой обработки в C ++

Может ли кто-нибудь опубликовать простой пример запуска двух (объектно-ориентированных) streamов в C ++.

Я ищу фактические объекты streamа C ++, которые я могу расширить методы запуска (или что-то подобное), в отличие от вызова библиотеки streamов C-стиля.

Обновление. Я отказался от каких-либо конкретных запросов ОС в надежде, что тот, кто ответил, ответит на использование библиотек кросс-платформ. Я просто делаю это прямо сейчас.

Создайте функцию, которую вы хотите выполнить, например:

void task1(std::string msg) { std::cout << "task1 says: " << msg; } 

Теперь создайте объект thread , который в конечном итоге вызовет функцию выше, например:

 std::thread t1(task1, "Hello"); 

(Для доступа к classу std::thread необходимо #include )

Аргументы конструктора - это функция, которую будет выполнять stream, а затем параметры функции. Нить автоматически запускается при строительстве.

Если позже вы хотите дождаться выполнения streamа, выполняющего эту функцию, вызовите:

 t1.join(); 

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


Код

 #include  #include  #include  using namespace std; // The function we want to execute on the new thread. void task1(string msg) { cout << "task1 says: " << msg; } int main() { // Constructs the new thread and runs it. Does not block execution. thread t1(task1, "Hello"); // Do other things... // Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution. t1.join(); } 

Дополнительная информация о std :: thread here

  • В GCC скомпилируйте с -std=c++0x -pthread .
  • Это должно работать для любой операционной системы, если ваш компилятор поддерживает эту функцию (C ++ 11).

Ну, технически любой такой объект будет построен поверх библиотеки streamов C-стиля, потому что C ++ только что std::thread модель std::thread в c ++ 0x, которая была просто прибита и еще не реализована. Проблема несколько системная, технически существующая модель памяти c ++ не является достаточно строгой, чтобы допускать четко определенную семантику для всех случаев «случится раньше». Ханс Бём некоторое время писал статью по этой теме и сыграл важную роль в том, чтобы выбить стандарт c ++ 0x по этой теме.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

Тем не менее, существует несколько кросс-платформенных библиотек C ++, которые отлично работают на практике. Блоки построения streamов Intel содержат объект tbb :: thread, который близко приближается к стандарту c ++ 0x, а Boost имеет библиотеку boost :: thread, которая делает то же самое.

http://www.threadingbuildingblocks.org/

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

Используя boost :: thread, вы получите что-то вроде:

 #include  void task1() { // do stuff } void task2() { // do stuff } int main (int argc, char ** argv) { using namespace boost; thread thread_1 = thread(task1); thread thread_2 = thread(task2); // do other stuff thread_2.join(); thread_1.join(); return 0; } 

Существует также библиотека POSIX для операционных систем POSIX. Проверьте совместимость

 #include  #include  #include  #include  void *task(void *argument){ char* msg; msg = (char*)argument; std::cout< 

скомпилировать с -lpthread

http://en.wikipedia.org/wiki/POSIX_Threads

Это во многом зависит от библиотеки, которую вы решили использовать. Например, если вы используете библиотеку wxWidgets, создание streamа будет выглядеть так:

 class RThread : public wxThread { public: RThread() : wxThread(wxTHREAD_JOINABLE){ } private: RThread(const RThread &copy); public: void *Entry(void){ //Do... return 0; } }; wxThread *CreateThread() { //Create thread wxThread *_hThread = new RThread(); //Start thread _hThread->Create(); _hThread->Run(); return _hThread; } 

Если ваш основной stream вызывает метод CreateThread, вы создадите новый stream, который начнет выполнять код в вашем методе «Ввод». В большинстве случаев вам нужно будет ссылаться на stream, чтобы присоединиться или остановить его. Подробнее здесь: документация wxThread

Вот более надежный способ создания произвольного количества streamов (в C ++ 11 или новее):

 #include  #include  using namespace std; void doSomething(int id) { cout << "Thread id = " << id; } /** * Spawns n threads */ void spawnThreads(int n) { thread threads[n]; // spawn n threads: for (int i = 0; i < n; i++) { threads[i] = thread(doSomething, i + 1); } for (auto& th : threads) { th.join(); } } 

При поиске примера classа C ++, который вызывает один из своих методов экземпляра в новом streamе, этот вопрос возникает, но мы не смогли использовать ни один из этих ответов таким образом. Вот пример, который делает это:

Class.h

 class DataManager { public: bool hasData; void getData(); bool dataAvailable(); }; 

Class.cpp

 #include "DataManager.h" void DataManager::getData() { // perform background data munging hasData = true; // be sure to notify on the main thread } bool DataManager::dataAvailable() { if (hasData) { return true; } else { std::thread t(&DataManager::getData, this); t.detach(); // as opposed to .join, which runs on the current thread } } 

Обратите внимание, что этот пример не попадает в мьютекс или блокировку.

Если в глобальных именах не требуется отдельная функция, мы можем использовать lambda-функции для создания streamов.

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

Вот пример кода

 int main() { int localVariable = 100; thread th { [=](){ cout<<"The Value of local variable => "< 

На сегодняшний день я нашел, что C ++ lambdas - лучший способ создания streamов, особенно для более простых функций streamа

  • Почему wait () всегда должен находиться в синхронизированном блоке
  • Исполнители Java: как я могу остановить отправленные задачи?
  • Можно ли заставить существующее приложение Java использовать не более x ядер?
  • Является ли java.sql.Connection streamом безопасным?
  • Когда использовать AtomicReference в Java?
  • Как получить указатель интерфейса JNI (JNIEnv *) для асинхронных вызовов
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Разница между запуском и запуском нити
  • Не могли бы вы объяснить STA и MTA?
  • Java: как использовать Thread.join
  • Что рекомендуется для нереста streamов из сервлета в Tomcat
  • Давайте будем гением компьютера.