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

> Внимание!

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

 
 Ответить  Открыть новую тему 
> Потоки в Linux, C
*оля*
сообщение 14.06.2011 20:33
Сообщение #1


Пионер
**

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

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


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

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

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


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


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

Только вот тогда непонятно, о каких объектах синхронизации речь. Если каждый файл обрабатывается своим потоком, и никакие другие потоки в этот процесс (и в этот же файл) не лезут - то никаких проблем быть не может, и не нужны тут никакие синхронизации в принципе. Непонятно. Может, у тебя задан какой-то конкретный алгоритм поиска, который внутри одного файла тоже можно распараллелить (разбросать на несколько потоков)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 14.06.2011 21:21
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 14.06.2011 22:02
Сообщение #4


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  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 
 К началу страницы 
+ Ответить 
*оля*
сообщение 14.06.2011 22:05
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 14.06.2011 22:41
Сообщение #6


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Это и есть параллельный, основной поток и дополнительно созданный будут выполняться одновременно. Последовательный - это без создания thread, просто сначала выведи 20 раз "a", а потом - 20 раз "b" smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 15.06.2011 12:49
Сообщение #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 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 15.06.2011 13:51
Сообщение #8


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  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 - 15.06.2011 13:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

- Текстовая версия 26.07.2025 21:42
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"