Простая поточная обработка C++

Эта строка:

vec.at(i)=vec.at(i+1);

Доступ к элементу за концом. Не очень хорошая идея добавить +1 к индексу, который уже идет в конец вектора: -)

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

Эта обратная функция использует rbegin () и rend () для инициализации нового вектора.

Наконец, я обнаружил, что если я использую getline (cin, input_line), я избегаю множества ошибок, с которыми я сталкиваюсь при попытке считывания данных непосредственно в переменные. Чем больше входных данных вы обрабатываете, тем чаще вы найдете это полезным.

Извините, что изменил typedefs обратно на std :: vector. У меня были проблемы с выполнением кода, и мне нужно было назвать переменные так, чтобы я мог их запомнить. Я стараюсь избегать имен односимвольных переменных. Отличная работа и удачи!

#include <iostream>
#include <vector>


std::vector<std::string>  reverse (std::vector<std::string>  vec)
{
  return std::vector<std::string> (vec.rbegin(), vec.rend());
}

int main()
{
  std::vector<std::string> string_vector;
  std::string input_line;
  std::cout << "Enter strings type esc to stop" << '\n';
  while (std::getline(std::cin, input_line) && input_line != "esc")
  {
    string_vector.push_back(input_line);
  }

  std::vector<std::string>  reversed = reverse(string_vector);
  std::cout << reversed.size();
  for (auto element:reversed)
    std::cout << ":" << element << ":" ;
}
9
задан Jon Tackabury 27 February 2009 в 20:05
поделиться

10 ответов

#include <boost/thread.hpp>

static boost::thread runStuffThread;

static void MyMethod(int data)
{
    runStuffThread = boost::thread(boost::bind(RunStuff, data));
}

// elsewhere...
runStuffThread.join(); //blocks
13
ответ дан 4 December 2019 в 07:15
поделиться

CreateThread (Win32) и AfxBeginThread (MFC) являются двумя способами сделать это.

Так или иначе Ваша подпись MyMethod должна была бы измениться немного.

Править: как отмечено в комментариях и другими респондентами, CreateThread может быть плохим.

_beginthread и _beginthreadex являются функциями библиотеки времени выполнения C, и согласно документам эквивалентны Системе:: Поточная обработка:: Поток:: Запустить

4
ответ дан 4 December 2019 в 07:15
поделиться

Простая поточная обработка в C++ является противоречием в терминах!

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

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

http://msdn.microsoft.com/en-us/library/kdzttdcb (По сравнению с 80) .aspx

Также static средства что-то другое в C++.

2
ответ дан 4 December 2019 в 07:15
поделиться

Рассмотрите использование пула потоков Win32 вместо того, чтобы вращать новые потоки для объектов работы. Вращение новые потоки расточительны - каждый поток получает 1 МБ зарезервированного адресного пространства для его стека по умолчанию, выполняет код запуска потока системы, заставляет уведомления быть поставленными почти каждому DLL в Вашем процессе и создает другой объект ядра. Пулы потоков включают Вам к потокам повторного использования для фоновых задач быстро и эффективно, и вырастут или уменьшатся на основе того, сколько задач Вы отправляете. В целом полагайте, что вращение выделило потоки для бесконечных фоновых задач, и используйте пул потоков для всего остального.

Перед Vista можно использовать QueueUserWorkItem. На Vista пул нового потока API более надежен и предлагает еще несколько расширенных настроек. Каждый заставит Ваш фоновый код начинать работать на некотором потоке пула потоков.

// Vista
VOID CALLBACK MyWorkerFunction(PTP_CALLBACK_INSTANCE instance, PVOID context);

// Returns true on success.
TrySubmitThreadpoolCallback(MyWorkerFunction, context, NULL);

// Pre-Vista
DWORD WINAPI MyWorkerFunction(PVOID context);

// Returns true on success
QueueUserWorkItem(MyWorkerFunction, context, WT_EXECUTEDEFAULT);
3
ответ дан 4 December 2019 в 07:15
поделиться

Другая альтернатива является pthreads - они работают над обоими окнами и Linux!

1
ответ дан 4 December 2019 в 07:15
поделиться

Этот сейф:

unsigned __stdcall myThread(void *ArgList) {
//Do stuff here
}

_beginthread(myThread, 0, &data);

Я должен сделать что-нибудь для освобождения памяти (как CloseHandle) после этого вызова?

1
ответ дан 4 December 2019 в 07:15
поделиться

CreateThread (Win32) и AfxBeginThread (MFC) являются двумя способами сделать это.

Старайтесь использовать _beginthread, если необходимо использовать библиотеку времени выполнения C (CRT) все же.

0
ответ дан 4 December 2019 в 07:15
поделиться

Если бы Вы действительно не хотите использовать третье лицо, освобождает (я рекомендовал бы повышение:: распараллельте, как объяснено в другом anwsers), необходимо использовать Win32API:

static void MyMethod(int data)
{

    int data = 3;

    HANDLE hThread = ::CreateThread(NULL,
        0,
        &RunStuff,
        reinterpret_cast<LPVOID>(data),
        0,
        NULL);


    // you can do whatever you want here

    ::WaitForSingleObject(hThread, INFINITE);
    ::CloseHandle(hThread);
}

static DWORD WINAPI RunStuff(LPVOID param)
{  

     int data = reinterpret_cast<int>(param);

     //long running operation here

     return 0;
}
0
ответ дан 4 December 2019 в 07:15
поделиться

Для win32 только и без дополнительных библиотек можно использовать функцию CreateThread http://msdn.microsoft.com/en-us/library/ms682453 (По сравнению с 85) .aspx

0
ответ дан 4 December 2019 в 07:15
поделиться

Там существует многие межплатформенные библиотеки поточной обработки C++ с открытым исходным кодом, которыми Вы могли пользоваться:

Среди них:

QT
Intel
Поток Повышения TBB

Путем Вы описываете это, я думаю, что или поток Intel TBB или Повышения будет прекрасен.

Пример Intel TBB:

class RunStuff
{
public:
  // TBB mandates that you supply () operator  
  void operator ()()
  {
    // long running operation here
  }
};

// Here's sample code to instantiate it
#include <tbb/tbb_thread.h> 

tbb::tbb_thread my_thread(RunStuff);

Пример потока повышения:
http://www.ddj.com/cpp/211600441

Спокойный пример:
http://doc.trolltech.com/4.4/threads-waitconditions-waitconditions-cpp.html
(Я не думаю, что это удовлетворяет Вашим потребностям, но просто включенный здесь для полноты; необходимо наследовать QThread, реализация, пусто выполненная (), и назвать QThread:: запустите ()):

Если Вы только программируете в Windows и не заботитесь о межплатформенном, возможно, Вы могли бы использовать поток Windows непосредственно:
http://www.codersource.net/win32_multithreading.html

0
ответ дан 4 December 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: