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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск файлов в потоках, не могу поймать ошибку 
:(
    Опции темы
eu6pc
Дата 14.4.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Коллеги, добрый день!
Помогите, пожалуйста, моему горю: уже 3 дня бьюсь - не могу найти ошибку.
Задача следующая: Сделать поиск файлов по содержимому в различных каталогах через потоки. Visual C++ 6. Вначале я ищу все нужные каталоги и ложу их в динамический массив. Затем запускаю потоки, и каждый поток ищет файлы в двух каталогах. Если файл находится - его имя заносится в динамический массив, используется мтьютекс.
 Проблема: если взять маленький каталог - все работает отлично, но если указать большой (например Install) - программа вылетает с ошибкой - операция обратилась к памяти по адресу ляляля, память не может быть read.
Не могу понять в чем дело ?
Если потоки запускать по одному - в цикле создавать и тут же ждать завершения - все работает.
Если отпускаешь потоки все сразу (хотябы первые 6-10) - появляется эта ошибка...
Ребята, подскажите, пожалуйста! Или хотя бы укажите в какую сторону копать...
Вот участок кода:
Функция main
Цитата

#include <pthread.h>

int main(int argc, char* argv[])
{
    int i;

    pthread_attr_t attrs;
    
    pthread_mutex_init(&mutex,NULL);

    //инициализация атрибутов потока
    if(0!=pthread_attr_init(&attrs))
    {
     perror("Cannot initialize attributes");
     abort();
    };

    //установка атрибута "присоединенный"
    if(0!=pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_JOINABLE))
    {
     perror("Error in setting attributes");
     abort();
    }

    strcpy(text,"fox");
    strcpy(put,"c:\\letters\\");

    
    dir=(mystr*)realloc(dir,sizeof(mystr)*(ind+1));
    strcpy(dir[ind].s,put);
    ind++;

    strcat(put,"*.*");

    SearchFolders(put,TRUE);
    // после вызова в массиве dir - каталоги, в переменной Ind - колво каталогов

    k_thrs=(ind/2)+(ind%2);
    printf("%d      %d\n",ind,k_thrs);
        pthread_t *thrs=new pthread_t[k_thrs];   // создаем массив потоков
    int *ids = new int[k_thrs];     // создаем массив id потоков 
    for (i=0;i<k_thrs;i++)
  ids[i]=i;        // инициализируем его 0,1,2,...

    //порождение  потоков
        for( i = 0; i<k_thrs; i++)
    {
     if(0!=pthread_create(&thrs[i], &attrs, prod, &ids[i]))
     {
      perror("Cannot create a thread");
      abort();
     }
    
    }  
   
    int k;
    //ожидание завершения порожденных потоков
    for( i = 0; i<k_thrs; i++)
     k=pthread_join(thrs[i], NULL);
     

    puts("result:");
    for(i=0;i<r_ind;i++)
  puts(res[i].s);

    delete [] thrs;
    delete [] ids;
    if (dir!=NULL)
    {
    free (dir);
    dir=NULL;
    }
    if (res!=NULL)
    {
    free (res);
    res=NULL;
    }
    //освобождение ресурсов, занимаемых описателем атрибутов
    pthread_attr_destroy(&attrs);

    puts("end!");
    return 0;
}



а вот сама функция потока:
Цитата

//функция потока
void* prod(void* me)

{    // начинаем поиск файлов в 2- каталогах согласно индексу потока
     LPTSTR part;
    char tmp[MAX_PATH]; // временный массив
    char name[MAX_PATH];
    char drive[5],path[250],fname[250],ext[7]; // для разделения пути;
    char lpszFileName[250];
    char fpath[250];
    HANDLE hSearch = NULL;
    WIN32_FIND_DATA wfd;
    FILE *f=NULL;
    //char buf[20];
    int pr=0;

    char *buf = new char[20];    
    
    //узнали номер потока
    int offset = *((int*)me);


    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

    
    for (int z=offset*2;(z<=offset*2+1)&&(z<ind);z++)
    {
    printf("potok N%d dir %s\n",offset,dir[z].s);
    hSearch = NULL;
    
    strcpy(lpszFileName,dir[z].s);
    strcat(lpszFileName,"*.*");

        GetFullPathName(lpszFileName, MAX_PATH, tmp, &part);
    
        strcpy(name, part);
        strcpy(part, "*.*");


        // если папки существуют, то делаем поиск
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
        do
        {
        if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            continue;
          
    
    _splitpath(lpszFileName,drive,path,fname,ext);
    strcpy(fpath,drive);
    strcat(fpath,path);
    strcat(fpath,wfd.cFileName);

      
    // обратотка файла -----------
    pr=0;

    f=NULL;
    f = fopen(fpath,"rb");


    if (f!=NULL)
    {
    
    
    do
    {
    if (!feof(f)&&!ferror(f)) fread(&buf[0],sizeof(char),1,f);
    if (buf[0]==text[0])
    {
     int j=1,t=0;

     while ((j<strlen(text))&&(!feof(f)&&(!ferror(f))&&(t==0)))
     {
      fread(&buf[j],sizeof(char),1,f);
      if (buf[j]!=text[j]) t=1;
      j++;

     }
     if (t==0) pr=1;

    }

    
    }
    while (!feof(f)&&(!ferror(f))&&(pr==0));

    fclose(f);
  
    f=NULL;

    // если pr=1 - значит файл содержит текст, добавляем его в массив

    if (pr==1)
    {
    
    pthread_mutex_lock(&mutex);

    res=(mystr*)realloc(res,sizeof(mystr)*(r_ind+1));
    
    strcpy(res[r_ind].s,fpath);
    r_ind++;
    
    //освобождение мьютекса
    pthread_mutex_unlock(&mutex);
    }    



    }



    // конец обработки файла -----
            
        }
  
        while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

        FindClose (hSearch); // заканчиваем поиск

    } // конец цикла по двум папкам




//--------------------------------------------------------
    delete [] buf;
    //pthread_exit(NULL); //?? нужно ли это
    
    return NULL;
    
}


PM MAIL   Вверх
ИванМ
Дата 14.4.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробуй расставить критические секции.
PM MAIL   Вверх
eu6pc
Дата 14.4.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так вроде в единственном месте, где происходит запись в глабальный массив res - используется мтьютекс. А больше,вроде бы, ничего критического нету... или я не прав ?
PM MAIL   Вверх
xvr
Дата 14.4.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



А можно узнать глубокий смысл делать жуткую помесь из Win32 API/posix и C/C++ (malloc/new)?
По поводу ошибки могу предположить, что вы где то угробили память, но где именно сказать не могу (из за очень 'структурированного' и 'понятного' стиля программирования)  smile 

PM MAIL   Вверх
eu6pc
Дата 14.4.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @ 14.4.2011,  12:41)
А можно узнать глубокий смысл делать жуткую помесь из Win32 smile

Контрольная работа, что ж с нее возьмешь... ;)


Уже разобрался: нужно было поменять свойства проекта. Поставил многопоточность - все заработало!!!!

спасибо всем за помощь! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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