Многопоточность

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
oksanavol
Сообщения: 2
Зарегистрирован: 14 июн 2017, 15:14

14 июн 2017, 15:16

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

Код: Выделить всё

#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;
}
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

14 июн 2017, 16:31

А где здесь многопоточность? У тебя CountValue вызывается в основном потоке.

А ещё замечу, что вызов lower_bound и upper_bound для несортированных данных тебя очень удивит результатами работы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
oksanavol
Сообщения: 2
Зарегистрирован: 14 июн 2017, 15:14

14 июн 2017, 17:02

Romeo писал(а):А где здесь многопоточность? У тебя CountValue вызывается в основном потоке.

А ещё замечу, что вызов lower_bound и upper_bound для несортированных данных тебя очень удивит результатами работы.
так я и написала что не правильно многопоточность у меня. И как нужно правильно чтобы подказали. Поэтому если есть идеи буду рада их услышать
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

14 июн 2017, 23:19

А ведь ничего сложно не было. Достаточно было написать в поисковике "std::thread" и ткнуть на первую ссылку. Та даже пример есть :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
oksanavol
Сообщения: 2
Зарегистрирован: 14 июн 2017, 15:14

14 июн 2017, 23:53

Romeo писал(а):А ведь ничего сложно не было. Достаточно было написать в поисковике "std::thread" и ткнуть на первую ссылку. Та даже пример есть :)

что честно? кеп) если бы так все просто было то давно уже сделалал б
oksanavol
Сообщения: 2
Зарегистрирован: 14 июн 2017, 15:14

14 июн 2017, 23:55

Romeo писал(а):А ведь ничего сложно не было. Достаточно было написать в поисковике "std::thread" и ткнуть на первую ссылку. Та даже пример есть :)

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