Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [boost::thread] Параллельность выполнения 
V
    Опции темы
borisbn
Дата 15.10.2011, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Добрый день.
Набросал наипростейшую программку с сабжем и ... не работает ( памагите smile )
Код

class Worker
{
public:
    static void s_thread_f( Worker * who, int value, int maxN ) {
        who->thread_f( value, maxN );
    }
    void print() {
        for ( auto i = m_storage.begin(); i != m_storage.end(); ++i ) {
            std::cout << (*i) << " ";
        }
    }
private:
    void thread_f( int value, int maxN ) {
        for ( int i = 0; i < maxN; i++ ) {
            m_mutex.lock();
            m_storage.push_back( value );
            m_mutex.unlock();
        }
    }

    boost::mutex m_mutex;

typedef std::vector< int > storage_t;
    storage_t m_storage;
};

int main()
{
    Worker worker;
    boost::thread thread1( Worker::s_thread_f, &worker, -42, 42 );
    boost::thread thread2( Worker::s_thread_f, &worker, 42, 42 );
    thread1.join();
    thread2.join();
    worker.print();
}

вывод
Цитата
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 -42 -42 
-42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42 -42
-42 -42 -42

http://liveworkspace.org/code/753152e3115e...788468135f2c606
Почему не в перемешку ?
Пробовал не 42 раза добавлять, а 500 - рез-т тот же.
Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 15.10.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



borisbn

Во первых элементов слишком мало (даже 500-а может не хватить), чтобы что-то почувствовать, скорее всего первый поток уже завершен, когда второй начинает работать.
Во вторых это зависит и от планировщика задач, возможно поток просто не получает управление.
Поставь барьер на входе и добавь boost::this_thread::yield().

Код

#include <boost/thread.hpp>
#include <boost/thread/barrier.hpp>
#include <iostream>

class Worker
{
public:
    void print()
   {
        for ( auto i = m_storage.begin(); i != m_storage.end(); ++i ) {
            std::cout << (*i) << " ";
        }
    }
    void thread_proc(int value, int maxN, int id) {
      boost::barrier meet_point(2);
        for ( int i = 0; i < maxN; i++ )
      {
            m.lock();
            m_storage.push_back(value);
            m.unlock();
         boost::this_thread::yield();
        }
    }
private:
   boost::mutex m;
   typedef std::vector< int > storage_t;
    storage_t m_storage;
};
int main()
{
    Worker worker;
    boost::thread thread1(&Worker::thread_proc, &worker, 0, 500, 0);
    boost::thread thread2(&Worker::thread_proc, &worker, 1, 500, 1);
    thread1.join();
    thread2.join();
    worker.print();
}

http://liveworkspace.org/code/f6daba84b38a...15813f0a0499dca


Это сообщение отредактировал(а) azesmcar - 15.10.2011, 10:50
PM   Вверх
borisbn
Дата 15.10.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(azesmcar @  15.10.2011,  10:48 Найти цитируемый пост)
добавь boost::this_thread::yield()

о! точно. сработало. спасибо.
а вот это
Цитата(azesmcar @  15.10.2011,  10:48 Найти цитируемый пост)
Поставь барьер на входе

не понял зачем... убрал - работает так же, как и без него.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 15.10.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(borisbn @  15.10.2011,  11:31 Найти цитируемый пост)
не понял зачем... убрал - работает так же, как и без него. 

На всякий случай, чтобы потоки дождались друг друга.
PM   Вверх
ecspertiza
Дата 15.10.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Я может что то из буста подзабыл, но на мой взгляд проблема в 

Код

thread1.join();
thread2.join();


ты сначала дожидаешься выполнения одного потока потом второго, вот они по очереди и работают.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
math64
Дата 15.10.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Нет, не в этом - без yield();  никто не хочет отдавать процессор, кто его забрал - тот и работает. На двухядерной машине потоки могли бы работать действительно одновременно. 
PM   Вверх
azesmcar
Дата 15.10.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(ecspertiza @  15.10.2011,  16:39 Найти цитируемый пост)
ты сначала дожидаешься выполнения одного потока потом второго, вот они по очереди и работают. 

Дожидается основной поток, а остальные два работают (их там три).
Цитата(math64 @  15.10.2011,  19:15 Найти цитируемый пост)
никто не хочет отдавать процессор, кто его забрал - тот и работает

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

Это сообщение отредактировал(а) azesmcar - 15.10.2011, 21:15
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.