Функция Thread с передается по ссылке вектор медленно запускается - PullRequest
8 голосов
/ 28 ноября 2011

Я смотрю на C ++ 0x темы и имею этот код:

#include <vector>
#include <iostream>
#include <thread>
void TestFunc(const vector<int>& vVec)
{
    cout << "in"<<endl;
}

int main()
{

    int sizer = 400000000;

    vector<int> vTest(sizer);
    for(int f=0; f<sizer; f++)
        vTest[f] = f;


   cout << "V created." << endl;

   thread one(TestFunc, vTest);

     one.join();    

}

Как видите, он просто передает вектор в поток. Я не понимаю, что после появления сообщения «V создан» возникает пауза. Первоначально это (я предположил) был вектор, который копируется для использования в функции. Чтобы остановить это, я передал ссылку вместо этого, но это не имело никакого значения.

Задержка кажется пропорциональной размеру вектора, который указывает, что он все еще копирует (или что-то делает с массивом). Если я попробую тот же эксперимент без потоков и просто вызову функцию напрямую, будет задержка при передаче по значению, но не при передаче по ссылке, как я ожидал.

Я попробовал то же самое, используя потоки Boost вместо C ++ 0x (хотя я читал, что они во многом совпадают) и получил тот же результат.

Есть ли какая-то причина для такого поведения или я пропустил что-то ослепительно очевидное? Благодаря.

Извините, опубликован неправильный тестовый код. Исправленный. Изменить: Добавлено включает в себя по запросу.

Скомпилировано с: g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test ... поскольку у меня установлен GNU 4.4 вместе со стандартным компилятором GNU, который поставляется с моим Linux (CentOS), который не поддерживает C ++ 11.

Ответы [ 2 ]

17 голосов
/ 28 ноября 2011

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

Чтобы сделать этот бетон, вы, вероятно, используете bind, например:

std::bind(TestFunc, vTest)

Вместо этого вам следуетиспользуйте это так:

std::bind(TestFunc, std::cref(vTest));
0 голосов
/ 28 ноября 2011

Где здесь темы?Похоже, петля for вызывает задержку , на которую вы ссылаетесь.Здесь нет ничего необычного - вы назначаете вектор размером 200000000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...