Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность 
:(
    Опции темы
oksanavol
Дата 14.6.2017, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.6.2017

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



У меня есть задачка: Есть два массива и нужно вывести сколько раз значения второго массива попадаются в первом масиве, я это сделала, но нужно использовать многопоточность, И тут нужна ваша помощь.
Скидываю свой код, сильно не бросайте камнями. Я попробывала раздилить на два потока. Но хочется правильно и красво сделать. 
Код

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <thread> 

size_t CountValue(const int* array, const size_t size, const int value)
{
    const int* begin = array;
    const int* end = array + size;

    const int* low = std::lower_bound(begin, end, value);
    if ((low != end) && (*low == value))
    {
        auto up = std::upper_bound(low, end, value);
        return std::distance(low, up);
    }
    return 0;
}

int main()
{
    int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    int size = sizeof(arraySecond) / sizeof(arraySecond[0]);
    std::sort(arraySecond, arraySecond + size);
    
    //const std::size_t maxThreadCount = std::thread::hardware_concurrency();
    //std::vector<std::thread> threads(maxThreadCount);

    std::vector<std::thread> threads1(size / 2);
    std::vector<std::thread> threads2(size / 2);
    for (int index = 0; index < size / 2; ++index) 
    {
        if (arraySecond[index] != arraySecond[index + 1])
            std::cout << "Value:" << arraySecond[index] << "-" << CountValue(arrayFirst, size, arraySecond[index]) << "\n";
        threads1[index].join();
    }
    for (int index = size / 2; index < size; ++index)
    {
        if (arraySecond[index] != arraySecond[index + 1])
            std::cout << "Value:" << arraySecond[index] << "-" << CountValue(arrayFirst, size, arraySecond[index]) << "\n";
        threads2[index].join();
    }
        
    return 0;
}

PM MAIL   Вверх
xvr
Дата 14.6.2017, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Это не два потока - это полный абзац  smile 

Потоков у вас будет size штук, и все будут делать 'ничего'.
Что бы они делали что то им нужно при создании передать функцию, которая и будет исполняться в потоке
Потом нужно как то вернуть то, что они насчитают.

Для начала определитесь, что именно вы хотите считать в каждом потоке. И куда возвращать результат.

PM MAIL   Вверх
oksanavol
Дата 14.6.2017, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.6.2017

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



xvr,  мне нужно чтобы подщитовала сколько раз значения с второго массива  встречается в первом  многопоточно. я так и не поняла как сделать.  
PM MAIL   Вверх
xvr
Дата 15.6.2017, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Это постановка задачи в общем. Все трудности как раз в деталях - что именно нужно разнести по разным потокам? Допустим нужно посчитать вхождение первой половины arraySecond в arrayFirst в одном потоке и вхождение 2й половины - во втором.
Тогда вам надо создать 2 потока (т.е. 2 экземпляра std::thread) и передать им индексы
как то так:
Код

std::vector<std::thread> thread_pool;

for(int index=0; index<size; index += size/2)
{
  thread_pool.push_back(std::thread( [=] () -> void {
    for(int i=0; i<size/2; ++i)
     {
       CountValue(arrayFirst, size, arraySecond[index+i]);
     }
  }  ));
}

for(auto & th: thread_pool) th.join();

Но сюда нужно добавить код для вывода результатов

PS. У вас в вашем оригинальном коде ошибка - сортировать нужно другой масив. И CountValue можно записать гораздо проще -

Код

size_t CountValue(const int* array, const size_t size, const int value)
{
    auto iter2 = std::equal_range(array, array+size, value);
    return std::distance(iter2.first, iter2.second);    
}


Это сообщение отредактировал(а) xvr - 15.6.2017, 13:46
PM MAIL   Вверх
Starikan
Дата 10.8.2017, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.10.2007

Репутация: 1
Всего: -15



xvr
Цитата(xvr @  15.6.2017,  13:45 Найти цитируемый пост)
Тогда вам надо создать 2 потока (т.е. 2 экземпляра std::thread) и передать им индексы

ты вообще понял что сказал?

наоборот надо создать 2 индекса и передать им потоки....
повнимательнее пожалуйста..
PM MAIL   Вверх
xvr
Дата 10.8.2017, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Starikan @  10.8.2017,  13:44 Найти цитируемый пост)
ты вообще понял что сказал?

То, что форум полумертвый, еще не повод оживлять его посредством троллинга. А особливо непонятливые получат бан  smile 

PM MAIL   Вверх
Starikan
Дата 10.8.2017, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.10.2007

Репутация: 1
Всего: -15



xvr, да че ты начинаешь, нормально же общались.. =(((
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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