Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost thread и переменная внутри


Автор: mrgloom 21.9.2011, 12:41
Код

for ( std::size_t idx = 0; idx < thcount; ++idx ) 
    {
        tg.create_thread(boost::bind(&task_execute, vec));

    }
tg.join_all();

void task_execute(vector<vector<point>>& vec)


внутри task_execute vec изменяется а по выходу все возвращается в прежнее положение как до вызова тредов.
почему так происходит? я же передаю по ссылке.

Автор: azesmcar 21.9.2011, 12:54
Используй http://www.boost.org/doc/libs/1_47_0/doc/html/ref.html.

Автор: mrgloom 21.9.2011, 15:28
а когда используется ref не производится копирование?

и еще такое ощущение что несколько тредов все равно не могут одновременно читать\записывать в вектор.
потому, что я пробовал с указателем void task_execute(vector<vector<point>>* vec)  были ошибки.

Автор: bsa 21.9.2011, 17:51
Цитата(mrgloom @  21.9.2011,  15:28 Найти цитируемый пост)
и еще такое ощущение что несколько тредов все равно не могут одновременно читать\записывать в вектор.
Интересно, а про синхронизацию доступа ты случаем не забыл? Ну там мьютексы, семафоры и пр...

Автор: azesmcar 21.9.2011, 23:23
Цитата(mrgloom @  21.9.2011,  15:28 Найти цитируемый пост)
а когда используется ref не производится копирование?

происходит копирование wrapper-а, сам объект (в данном случае вектор) не копируется.

Автор: mrgloom 22.9.2011, 09:21
Цитата(bsa @  21.9.2011,  17:51 Найти цитируемый пост)
Цитата(mrgloom @  21.9.2011,  15:28 )
и еще такое ощущение что несколько тредов все равно не могут одновременно читать\записывать в вектор.
Интересно, а про синхронизацию доступа ты случаем не забыл? Ну там мьютексы, семафоры и пр...


ну вот я их как раз не делал. 

Цитата(azesmcar @  21.9.2011,  23:23 Найти цитируемый пост)
а когда используется ref не производится копирование?

происходит копирование wrapper-а, сам объект (в данном случае вектор) не копируется.

ну если у меня гигантский вектор как это скажется на производительности?
т.е. этот wrapper константный что у большого вектора что у маленького и никакой разницы?


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

и ко всем переменным обращаюсь теперь через указатель, или надо использовать ref?

Автор: azesmcar 22.9.2011, 09:32
Цитата(mrgloom @  22.9.2011,  09:21 Найти цитируемый пост)
т.е. этот wrapper константный что у большого вектора что у маленького и никакой разницы?

Wrapper содержит ссылку на твой вектор и его размер не зависит от размера твоего вектора.

Цитата(mrgloom @  22.9.2011,  09:21 Найти цитируемый пост)
ну вот я их как раз не делал. 

ну а чего ты тогда хочешь?

Цитата(mrgloom @  22.9.2011,  09:21 Найти цитируемый пост)
ну вообщем пока проблему решил путем разделения входного вектора задач на N векторов( каждому треду по вектору)  и так же каждому треду отдельно передается и выходной вектор  потом после обработки это все сливается в общий.
вообщем не очень красивое решение по памяти.

Если каждый поток работает с отдельными данными, то в чем тогда проблема? Разделять вектор физически не надо, передавай тот же вектор и передавай индексы первого и последнего элемента, которые поток должен обрабатывать.

Автор: mrgloom 22.9.2011, 09:59
Цитата(azesmcar @  22.9.2011,  09:32 Найти цитируемый пост)
Если каждый поток работает с отдельными данными, то в чем тогда проблема? Разделять вектор физически не надо, передавай тот же вектор и передавай индексы первого и последнего элемента, которые поток должен обрабатывать.

ну ок. с входным вектором тогда понятно.


есть ли какие то готовые решения которые ведут себя по разному в зависимости от того работают потоки с взаимонезависимыми частями (скажем вектора) или с пересекающимися?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)