1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
здравствуйте. Нужно сделать задание, но сколько ни читаю, никак не приходит понимае что же все-таки и как нужно сделать.
само задание : Поиск слова, в нескольких текстовых файлах; 1)Выполнить задание последовательным алгоритмом; 2)Выполнить задание параллельным алгоритмом (обязательно использовать для разграничения общих ресурсов системные объекты синхронизации); 3)Сделать анализ быстродействия последовательного и параллельного алгоритмов.
буду очень благодарна, если кто-нибудь объяснит как делать.
Используешь, скажем, pthread... Пишешь функцию потока, которая открывает один файл, и шерстит его в поисках заданного слова. Потом создаешь несколько таких потоков, каждому из которых передаешь свое имя файла, и пускай каждый поток занимается своей работой. Это будет параллельное выполнение. А потом, для теста, делаешь обработку всех файлов одной и той же функцией, в цикле. И сравниваешь скорости.
Только вот тогда непонятно, о каких объектах синхронизации речь. Если каждый файл обрабатывается своим потоком, и никакие другие потоки в этот процесс (и в этот же файл) не лезут - то никаких проблем быть не может, и не нужны тут никакие синхронизации в принципе. Непонятно. Может, у тебя задан какой-то конкретный алгоритм поиска, который внутри одного файла тоже можно распараллелить (разбросать на несколько потоков)?
Используешь, скажем, pthread... Пишешь функцию потока, которая открывает один файл, и шерстит его в поисках заданного слова. Потом создаешь несколько таких потоков, каждому из которых передаешь свое имя файла, и пускай каждый поток занимается своей работой. Это будет параллельное выполнение. А потом, для теста, делаешь обработку всех файлов одной и той же функцией, в цикле. И сравниваешь скорости.
Только вот тогда непонятно, о каких объектах синхронизации речь. Если каждый файл обрабатывается своим потоком, и никакие другие потоки в этот процесс (и в этот же файл) не лезут - то никаких проблем быть не может, и не нужны тут никакие синхронизации в принципе. Непонятно. Может, у тебя задан какой-то конкретный алгоритм поиска, который внутри одного файла тоже можно распараллелить (разбросать на несколько потоков)?
// Создаем поток thread, выполняющий thread_func if (pthread_create(&thread, NULL, thread_func, NULL) != 0) { return EXIT_FAILURE; // Не удалось создать, выходим с ошибкой }
// 20 раз выводим "а" и ждем секунду. В это время уже работает второй поток, // который печатает "b" и тоже ждет секунду. Поэтому выводы основного и // дополнительного потоков должны чередоваться for (i = 0; i < 20; i++) { puts("a"); wait_thread(); }
// если дождались завершения потока - то все нормально, иначе // выходим с ошибкой... if (pthread_join(thread, NULL) != 0) { return EXIT_FAILURE; }
// Создаем поток thread, выполняющий thread_func if (pthread_create(&thread, NULL, thread_func, NULL) != 0) { return EXIT_FAILURE; // Не удалось создать, выходим с ошибкой }
// 20 раз выводим "а" и ждем секунду. В это время уже работает второй поток, // который печатает "b" и тоже ждет секунду. Поэтому выводы основного и // дополнительного потоков должны чередоваться for (i = 0; i < 20; i++) { puts("a"); wait_thread(); }
// если дождались завершения потока - то все нормально, иначе // выходим с ошибкой... if (pthread_join(thread, NULL) != 0) { return EXIT_FAILURE; }
return EXIT_SUCCESS; }
спасибо. стало немного понятнее а как будет выглядеть параллельный алгоритм для этого же примера тогда?
Это и есть параллельный, основной поток и дополнительно созданный будут выполняться одновременно. Последовательный - это без создания thread, просто сначала выведи 20 раз "a", а потом - 20 раз "b"
Это и есть параллельный, основной поток и дополнительно созданный будут выполняться одновременно. Последовательный - это без создания thread, просто сначала выведи 20 раз "a", а потом - 20 раз "b"
/* Это в принципе не нужно теперь, можно убрать... */ static void wait_thread(void) { time_t start_time = time(NULL);
while (time(NULL) == start_time) { /**/ } }
int stop_access = 0;
static void *thread_func(void *vptr_args) { while(stop_access) /* Ждем, пока другой поток, возможно выводит свое сообщение */ { }
/* Потом блокируем вывод и выводим сообщение ЭТОГО потока */ stop_access = 1; printf(" %s\n", (char*)vptr_args); stop_access = 0; /* Выведено, можно разблокировать */
if (pthread_join(first_thread, NULL) != 0) { return EXIT_FAILURE; } if (pthread_join(second_thread, NULL) != 0) { return EXIT_FAILURE; }
return EXIT_SUCCESS; }
Если не сделать махинаций с stop_access, то получишь разные причудливые сообщения (буквы перемешаются между собой, скажем, первая - из первого потока, потом две - из второго, потом 4 опять из первого, и т.д... Чтобы это предотвратить - запрещаем вывод, пока кто-то другой выводит свою информацию... Это гарантирует корректное отображение...