IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Потоки в Linux, C
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


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

само задание : Поиск слова, в нескольких текстовых файлах;
1)Выполнить задание последовательным алгоритмом;
2)Выполнить задание параллельным алгоритмом (обязательно использовать для разграничения общих ресурсов системные объекты синхронизации);
3)Сделать анализ быстродействия последовательного и параллельного алгоритмов.

буду очень благодарна, если кто-нибудь объяснит как делать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Используешь, скажем, pthread... Пишешь функцию потока, которая открывает один файл, и шерстит его в поисках заданного слова. Потом создаешь несколько таких потоков, каждому из которых передаешь свое имя файла, и пускай каждый поток занимается своей работой. Это будет параллельное выполнение. А потом, для теста, делаешь обработку всех файлов одной и той же функцией, в цикле. И сравниваешь скорости.

Только вот тогда непонятно, о каких объектах синхронизации речь. Если каждый файл обрабатывается своим потоком, и никакие другие потоки в этот процесс (и в этот же файл) не лезут - то никаких проблем быть не может, и не нужны тут никакие синхронизации в принципе. Непонятно. Может, у тебя задан какой-то конкретный алгоритм поиска, который внутри одного файла тоже можно распараллелить (разбросать на несколько потоков)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(IUnknown @ 14.06.2011 20:54) *

Используешь, скажем, pthread... Пишешь функцию потока, которая открывает один файл, и шерстит его в поисках заданного слова. Потом создаешь несколько таких потоков, каждому из которых передаешь свое имя файла, и пускай каждый поток занимается своей работой. Это будет параллельное выполнение. А потом, для теста, делаешь обработку всех файлов одной и той же функцией, в цикле. И сравниваешь скорости.

Только вот тогда непонятно, о каких объектах синхронизации речь. Если каждый файл обрабатывается своим потоком, и никакие другие потоки в этот процесс (и в этот же файл) не лезут - то никаких проблем быть не может, и не нужны тут никакие синхронизации в принципе. Непонятно. Может, у тебя задан какой-то конкретный алгоритм поиска, который внутри одного файла тоже можно распараллелить (разбросать на несколько потоков)?


неа, конкретный алгоритм поиска не задан.



ну, если посмотреть пример :


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

static void wait_thread(void)
{
time_t start_time = time(NULL);

while (time(NULL) == start_time)
{
// do nothing except chew CPU slices for up to one second.
}
}

static void *thread_func(void *vptr_args)
{
int i;

for (i = 0; i < 20; i++)
{
fputs(" b\n", stderr);

wait_thread();
}

return NULL;
}

int main(void)
{
int i;
pthread_t thread;

if (pthread_create(&thread, NULL, thread_func, NULL) != 0)
{
return EXIT_FAILURE;
}

for (i = 0; i < 20; i++)
{
puts("a");

wait_thread();
}

if (pthread_join(thread, NULL) != 0)
{
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}




то нужно части, где выводятся а и в поменять на алгоритм поиска слова в 1 и 2 файле?
а можно немного прокомментировать где что делается?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


int main(void)
{
int i;
pthread_t thread;

// Создаем поток 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;
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(IUnknown @ 14.06.2011 22:02) *

int main(void)
{
int i;
pthread_t thread;

// Создаем поток 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;
}




спасибо. стало немного понятнее smile.gif
а как будет выглядеть параллельный алгоритм для этого же примера тогда?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Это и есть параллельный, основной поток и дополнительно созданный будут выполняться одновременно. Последовательный - это без создания thread, просто сначала выведи 20 раз "a", а потом - 20 раз "b" smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(IUnknown @ 14.06.2011 22:41) *

Это и есть параллельный, основной поток и дополнительно созданный будут выполняться одновременно. Последовательный - это без создания thread, просто сначала выведи 20 раз "a", а потом - 20 раз "b" smile.gif


т.е. это будет выглядеть так?


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

static void wait_thread(void)
{
time_t start_time = time(NULL);

while (time(NULL) == start_time)
{
// do nothing except chew CPU slices for up to one second.
}
}

static void *thread_func(void *vptr_args)
{

FILE *f1;
char search[3];
strcpy(search,"rrr");
char buf[200];
int i;

{

f1=fopen("1.txt","r");
while(fgets(buf,200,f1)!=NULL)
{
i=0;
while(i<(200-strlen(search)+1))
{
int j=0;
if(buf[i]==search[j])
{
int j1=i;
while ((j1-i<strlen(search))&&(buf[j1]==search[j]))
{
j1++;
j++;
}
if (j1-i+1==strlen(search)) printf("%s\n",search);
}
i++;
}}
fclose(f1);
wait_thread();
}

return NULL;
}

int main(void)
{
int ii;
FILE *f2;
char search1[3];
strcpy(search1,"yyy");
char buf1[200];

pthread_t thread;

if (pthread_create(&thread, NULL, thread_func, NULL) != 0)
{
return EXIT_FAILURE;
}


f2=fopen("2.txt","r");
while(fgets(buf1,200,f1)!=NULL)
{
ii=0;
while(ii<(200-strlen(search)+1))
{
int jj=0;
if(buf[ii]==search[jj])
{
int jj1=ii;
while ((jj1-ii<strlen(search1))&&(buf1[jj1]==search1[jj]))
{
jj1++;
jj++;
}
if (jj1-i+1==strlen(search1)) printf("%s\n",search1);
}
ii++;
}}
fclose(f2);
wait_thread();
}

if (pthread_join(thread, NULL) != 0)
{
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}





 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Для того, чтобы запустить одновременный поиск в двух файлах, не нужно дублировать один и тот же код дважды. Достаточно сделать так:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

/* Это в принципе не нужно теперь, можно убрать... */
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; /* Выведено, можно разблокировать */

/* Тут реализуешь свой поиск... */
return NULL;
}

int main(void)
{
pthread_t first_thread, second_thread;
char *fn_1 = "file_1.txt\0";
char *fn_2 = "file_2.txt\0";

if (pthread_create(&first_thread, NULL, thread_func, (void*)fn_1) != 0)
{
return EXIT_FAILURE;
}
if (pthread_create(&second_thread, NULL, thread_func, (void*)fn_2) != 0)
{
return EXIT_FAILURE;
}

/* Теперь ждем завершения обоих потоков */

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 опять из первого, и т.д... Чтобы это предотвратить - запрещаем вывод, пока кто-то другой выводит свою информацию... Это гарантирует корректное отображение...

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 21:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name