Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2018, 11:46   #1
olena_nov
 
Регистрация: 26.12.2017
Сообщений: 8
По умолчанию Определить, сколько раз каждый символ встречается в файле через многопоточность

Мой код. Написала что смогла. Теперь нужна ваша помощь. Подскажите
что не правильно. И как лутче подщет делать?
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>
#include <atomic>
#include <thread>

void TextThread(std::string str)
{
	std::ifstream text(str);
	if (!text)
		std::cout << "No open file" << "\n";

	std::istream_iterator<char> input(text);
	std::istream_iterator<char> output;
	
	std::vector<char> symvol(input, output);

	unsigned maxThreadCount = std::thread::hardware_concurrency();
	const std::size_t minLength = symvol.size() / maxThreadCount;
	const std::size_t modulo = symvol.size() % maxThreadCount;

	std::vector<std::size_t> results;
	results.reserve(maxThreadCount);

	std::vector<std::thread> threads;
	threads.reserve(maxThreadCount - 1);
	for (std::size_t i = 0; i < modulo; ++i)
		results.emplace_back(minLength + 1);

	if (minLength > 0)
	{
		for (std::size_t i = modulo; i < maxThreadCount; ++i)
			results.emplace_back(minLength);
	}
	for (std::size_t i = 1; i < threads.size(); ++i)
		threads.emplace_back(threads[i - 1] + 1, threads[i - 1] + threads[i]);

	std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
	

	for (unsigned int i = 0; i < symvol.size(); ++i)
		std::cout << symvol[i] << "\n";
}

int main()
{
	TextThread("D:\\text.txt");
    return 0;
}
olena_nov вне форума Ответить с цитированием
Старый 01.02.2018, 12:59   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Эт че за магия?
Код:
for (std::size_t i = 1; i < threads.size(); ++i)
		threads.emplace_back(threads[i - 1] + 1, threads[i - 1] + threads[i]);
Вообще идеально просто было бы вот это
https://gcc.gnu.org/onlinedocs/libst...ode_using.html

__gnu_parallel::for_each

но заработает не на всех компиляторах.

В вашем случае, делаете массив потоков, пока там почти все верно. Дальше, весь текстовый файл делите на интервалы равные, каждый поток работает со своим интервалом исходного файла (это еще массив {начало-конец}). Далее каждый поток проходит циклом свой интервал от начала до конца и изменяет АТОМАРНЫЙ std::atomic<int> счетчик в массиве счетчиков(общем). Массив счетчиков имеет размер 256 по числу кодов букв, т.е. вы раздельно считаете каждый символ по его коду.

Если в задаче допустимо более 256 символов (т.е. юникод - китайский, японский и т.д.). То массив счетчиков нужна заменять на карту счетчиков (std::map<size_t, std::atomic<int>>). Получать ссылку/указатель на него, предварительно обезопасив через std::mutex, но это сильно просадит производительность.

Последний раз редактировалось alexzk; 01.02.2018 в 13:04.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно написать программу в с++. определить длину строки и определить сколько раз встречается буква П в строке. chit Помощь студентам 4 11.07.2015 14:03
Определить сколько раз слово встречается в файлах. McFrey Помощь студентам 10 06.04.2015 21:02
Программа на Delphi, считающая сколько раз в тексте встречается каждый символ, биграмма, триграмма denis_dneprovski Помощь студентам 17 11.10.2010 06:15
Как подсчитать сколько раз встречается символ в строке? zver777 Общие вопросы Delphi 10 10.01.2010 00:57
PHP.Как посчитать, сколько раз слово встречается в файле? Princesse Помощь студентам 0 07.12.2009 00:24