![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
нужно организовать поиск файла по заданной файловой маске с сохранением результатов в однонаправленном списке.
количество потоков - 3. механизм синхронизации - мьютекс |
|||
|
||||
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
на какие потоки разбить данную задачу?
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
redwhite90, в чём сложность?
-------------------- вопросов больше чем ответов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Один поток сканирует файловую систему
Второй выделяет нужные файлы Третий выводит По крайней мере в классической задаче по форматированию текста: Первый поток читает файл и выделяет слова Второй из слов составляет строки при заданной максимальной длине строки Третий вставляет между словами пробелы для выравнивания и печатает Потоки на самом деле в обеих задачах не нужны, просто демонстрация работы и синхронизации потоков |
|||
|
||||
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
да, это только знакомство с потоками.
я тут почитал разную информацию и у меня теперь в голове всё перепуталось - не понимаю как это вообще писать. Добавлено через 1 минуту и 9 секунд где это написано по-простому? Добавлено через 3 минуты и 40 секунд Леопольд, сложность в том, что я впервые работаю с потоками и мне очень всё это непонятно. |
|||
|
||||
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
что-то мне никак не разобраться - надо что-то типа "потоки для чайников"
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
redwhite90, ЯП какой? ОС какая?
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
вот они потоки для чайников http://wm-help.net/books-online/book/59464/59464-25.html#h6
Там же найдешь и синхронизацию между потоками. Это сообщение отредактировал(а) Dem_max - 11.10.2011, 04:37 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
ЯП - с++
ОС - вообще надо и на винде и на юниксе. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: -1 Всего: 1 |
я бы предложил методы параллельного вычисления..
пример 1: 1) находим все директории поиска, записываем их в массив 2) создаем n потоков, и распределяем массив директорий равными долями между потоками 3) в каждом потоке выполняется поиск пример 2: 1) находим все файлы в директориях поиска, записываем их в массив 2) создем n потоков, и распределяем массив файлов равными долями между потоками 3) в каждом потоке выполняем поиск примечание: 1) поток, который нашел искомый файл, в некую глобальную переменную записывает специальный код - файл найден - все потоки прекращают свою работу 2) в случае шаблонного поиска, поиск продолжается пока все потоки не завершат свою работу, перебрав все файлы.. PS про параллельные вычисления можно почитать здесь: http://www.software.unn.ac.ru/ccam/files/H...sion/part4.html PSPS возможно это не то что тебе было нужно - тебе нужно расмотреть вопросы синхронизации, использования общих ресурсов и т.д. - тогда просто проигнорируй данное сообщение Это сообщение отредактировал(а) fish9370 - 11.10.2011, 11:28 -------------------- undefined |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
http://doc.qt.nokia.com/latest/qdir.html#entryList
http://www.boost.org/doc/libs/1_47_0/libs/...c/tutorial.html Добавлено через 2 минуты и 46 секунд или потоки нужны обязательно ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Для начала нужно составить линейное решение (без потоков). Предположим, что поиск ведется рекурсивно. Поэтому выходят следующие этапы работы программы: 1. зайти в каталог 2. просканировать его и проверить все файлы на предмет совпадения имен 3. повторить 1-3 для всех найденых подкаталогов. Выглядит это, как типичная рекурсия. Но рекурсивная обработка будет медленней, чем многопоточная. Поэтому делать можно через очередь определенного набора задач: просканировать каталог (СК), сравнить файл (СФ) и, если подошел, то добавить в список. Итак, каждый поток: 1. захватывает мьютекс синхронизации очереди 2. берет первую задачу из очереди (удаляя ее оттуда, соответственно) 3. освобождает мьютекс синхронизации очереди 4. выполняет задачу: 4.1. если задача СК, то перед добавлением очередной задачи надо захватывать мьютекс очереди, а после - освобождать 4.2. если задача СФ, то при совпадении файла захватывать мьютекс синхронизации списка результатов, добавлять имя файла в список, освобождать мьютекс Для выполнения этой задачи понадобится: 1. структура, содержащая код задачи (enum, например) и строку (std::string) - путь к файлу/каталогу; назовем ее Task 2. Очередь задач, например: std::queue<Task> 3. Мьютекс синхронизации очереди задач, например boost::mutex или std::mutex (если компилятор поддерживает стандарт C++11) 4. Список результатов, например: std::forward_list<std::string> (если есть поддержка стандарта С++11) 5. Мьютекс синхронизации списка результатов 6. И, самое главное, класс управления потоками, например: boost::thread или std::thread (если есть поддержка стандарта С++11) P.S.: Если компилятор не поддерживает С++11, то стоит воспользоваться библиотекой boost. Если ей нельзя пользоваться, то придется городить велосипеды с использованием стандартного API систем (EnterCriticalSection/LeaveCriticalSection и pthread_mutex_lock/pthread_mutex_unlock). Если нельзя использовать даже STL (стандартную библиотеку шаблонов), то язык программирования надо называть не С++, а С. В этом случае придется писать ручками даже очередь со списком... Это сообщение отредактировал(а) bsa - 11.10.2011, 12:37 |
|||
|
||||
| redwhite90 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 14.7.2011 Репутация: нет Всего: нет |
bsa, спасибо.
я понял, что я немогу сделать даже первые 3 пункта. подскажите? Это сообщение отредактировал(а) redwhite90 - 11.10.2011, 12:35 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
redwhite90, ты не можешь сделать структуру Task с двумя полями, объявить глобальные переменные типа std::queue<Task>, std::mutex и std::forward_list<std::string>?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |