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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> первая программа с потоками, как написать 
:(
    Опции темы
redwhite90
Дата 10.10.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нужно организовать поиск файла по заданной файловой маске с сохранением результатов в однонаправленном списке.
количество потоков - 3.
механизм синхронизации - мьютекс

PM MAIL   Вверх
redwhite90
Дата 10.10.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



на какие потоки разбить данную задачу?
PM MAIL   Вверх
Леопольд
Дата 10.10.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



redwhite90, в чём сложность?


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
math64
Дата 10.10.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Один поток сканирует файловую систему
Второй выделяет нужные файлы
Третий выводит

По крайней мере в классической задаче по форматированию текста:
Первый поток читает файл и выделяет слова
Второй из слов составляет строки при заданной максимальной длине строки
Третий вставляет между словами пробелы для выравнивания и печатает

Потоки на самом деле в обеих задачах не нужны, просто демонстрация работы и синхронизации потоков
PM   Вверх
redwhite90
Дата 10.10.2011, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, это только знакомство с потоками.

я тут почитал разную информацию и у меня теперь в голове всё перепуталось - не понимаю как это вообще писать.

Добавлено через 1 минуту и 9 секунд
где это написано по-простому?

Добавлено через 3 минуты и 40 секунд
Леопольд, сложность в том, что я впервые работаю с потоками и мне очень всё это непонятно.
PM MAIL   Вверх
redwhite90
Дата 10.10.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что-то мне никак не разобраться - надо что-то типа "потоки для чайников"
PM MAIL   Вверх
volatile
Дата 11.10.2011, 00:34 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(redwhite90 @  10.10.2011,  21:41 Найти цитируемый пост)
"потоки для чайников" 

или как наполнить чайник из трех потоков  smile 
PM MAIL   Вверх
boostcoder
Дата 11.10.2011, 04:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



redwhite90, ЯП какой? ОС какая?
PM WWW   Вверх
Dem_max
Дата 11.10.2011, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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")
PM MAIL   Вверх
redwhite90
Дата 11.10.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ЯП - с++
ОС - вообще надо  и на винде и на юниксе.
PM MAIL   Вверх
fish9370
Дата 11.10.2011, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW ICQ   Вверх
borisbn
Дата 11.10.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
QDir( "root/dir" )::entryList( QStringList() << "*.ext", QDir::Files | QDir::NoDotAndDotDot );

http://doc.qt.nokia.com/latest/qdir.html#entryList

Код

    boost::filesystem::path p( "." );
    std::list< boost::filesystem::directory_entry > files; 
    std::copy( boost::filesystem::directory_iterator(p),
               boost::filesystem::directory_iterator(),
               std::back_inserter( files )
    );

http://www.boost.org/doc/libs/1_47_0/libs/...c/tutorial.html

Добавлено через 2 минуты и 46 секунд
или потоки нужны обязательно ?


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(redwhite90 @  10.10.2011,  20:23 Найти цитируемый пост)
нужно организовать поиск файла по заданной файловой маске с сохранением результатов в однонаправленном списке.
количество потоков - 3.
механизм синхронизации - мьютекс

Для начала нужно составить линейное решение (без потоков). Предположим, что поиск ведется рекурсивно. Поэтому выходят следующие этапы работы программы:
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
PM   Вверх
redwhite90
Дата 11.10.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



bsa, спасибо.

я понял, что я немогу сделать даже первые 3 пункта.
подскажите?

Это сообщение отредактировал(а) redwhite90 - 11.10.2011, 12:35
PM MAIL   Вверх
bsa
Дата 11.10.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



redwhite90, ты не можешь сделать структуру Task с двумя полями, объявить глобальные переменные типа std::queue<Task>, std::mutex и std::forward_list<std::string>?
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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