2015-12-21 2 views
-2

Мой код делает меня сумасшедшим, так как иногда он работает нормально, но иногда возникает ошибка сбрасывания ядра или сегментации или двойной ошибки (faststop). Я думаю, это потому, что некоторые потоки не могут быть созданы, но я не мог этого сделать. Что не так с этим кодом? Этот код должен найти \ n в текстовом файле, который хранится в пути.Ошибка сегментации (сбрасывание ядра) при многопоточности в C++

Вот код:

Это Search_inp структура

typedef struct Search_inp{ 
    string * path; 
    string * phrase; 
    int a ; 
    int b; 
    int file_size; 
    vector<int>* vec; 
}search_inp; 

Эта функция должна возвращать void * указатель на структуру, которая содержит мои данные, которые я хочу передать нитку!

void * make_search_inp(string & path , string & phrase , int a , int b , int file_size , vector<int>&vec){ 
    search_inp * res = (search_inp*)malloc(sizeof(search_inp)); 
    res->path = &path; 
    res->phrase = & phrase; 
    res->a = a; 
    res->b = b; 
    res -> file_size = file_size; 
    res->vec = &vec; 
    return (void *)res; 
} 

Эта функция начинает поиска \ п в файле

// this function will multi thread the search of \n's and do this through search func 
void find_backslash(string path , vector<int> &place_backslash , int file_size){ 
    int counter = 0; 
    string backslash = "\n"; 
    vector<void*>temp; 
    vector<pthread_t> tid; 
    pthread_t t; 
    while(counter * range <= file_size){ 
     temp.push_back(make_search_inp(path , backslash , counter*range , (counter+1)*range-1 , file_size , place_backslash)); 
     pthread_create(&t, NULL , search , temp.back()); 
     tid.push_back(t); 
     counter++; 
    } 
    for(int i = 0 ; i<tid.size() ;i++) pthread_join(tid[i] , NULL); 
    //when the erorr happend program can not reach this place... 
    while(tid.size()) tid.pop_back(); 
    while(temp.size()) temp.pop_back(); 
    sort(place_backslash.begin() , place_backslash.end()); 

} 

Это функция поиска моего кода:

void* search(void * temp){ 
    search_inp* Stemp = (search_inp*)temp; 
    string path = *(Stemp->path); 
    string phrase = *(Stemp->phrase); 
    int a = Stemp->a; 
    int b = Stemp->b; 
    int file_size = Stemp->file_size; 
    vector<int>&vec = *(Stemp->vec); 

    if(path == "") return NULL;//check the path correctness 

    ifstream fin;//1opening the file 2check if the file opening is successful 3put the g in the correct place with seekg 
    fin.open(path.c_str()); 
    if(a < 0) a=0; 
    if(b < 0) b=0; 
    if(a >file_size) 
     a = b = file_size; 
    if(b > file_size){ 
     b = file_size; 
    } 
    fin.seekg(a , fin.beg); 

    if(!fin){ 
     cout << "ERROR:File Does Not Exist!" << endl; 
     return NULL; 
    } 
    //opening the output file for 
    //The search phase 
    int counter=0 , charNum =a;//this counter hold the number of appearance of the phrase in the file 

    while(!fin.eof() && charNum < b){ 
     int cnt = 0;char inp; 
     do{ 
     fin.get(inp);charNum++; 
     if(phrase[cnt] == inp) 
      cnt++; 
     else 
      break; 
     }while(cnt<phrase.length() && !fin.eof()); 
     if(cnt == phrase.length()){ 
      counter++; 
      vec.push_back(((int)fin.tellg())-1); 
     } 
    } 
    fin.close(); 

} 

Я запустить эту программу вызова find_backslah(path_of_my_file , a vector<int> , size_of_file) и получить ошибка иногда, и это не происходит всегда.

+4

Пожалуйста, уменьшите код до минимального, но полного примера. Также ознакомьтесь с инструкциями по публикации этого сайта. –

+0

Вы можете * попытаться поймать крах в действии, запустив свою программу в отладчике. Отладчик остановится в месте сбоя и позволит вам просмотреть переменные и их значения, и, самое главное, позволить вам изучить и * подойти * стек вызовов функций, чтобы вы могли перейти к вашему коду (если отладчик не сделал этого, t остановить код уже). Если вы все еще не можете понять это сами, то по крайней мере сообщите нам, где в вашем коде произошел сбой. –

+0

Кроме того, почему вы смешиваете C и C++ так много? Если вы программируете на C++, вы должны использовать классы и операторы C++. Поэтому вместо использования, например, 'malloc' для выделения памяти вы должны использовать оператор' new'. В вашем коде есть и другие проблемные вещи, например использование 'while (! Fin.eof())', которое почти всегда неверно, и использование большего количества указателей, чем обычно здоровые (и проблемы с указателями очень распространены, когда речь идет о сегментации неисправности). Вы также можете проверить ['std :: thread'] (http://en.cppreference.com/w/cpp/thread/thread). –

ответ

1

Я просто догадываюсь о проблеме здесь, но вы передаете структуру (указатель на) для всех потоков, и все потоки имеют некоторые общие указатели, которые все они разделяют в структуре, например std::vector. Если несколько потоков пытаются изменить вектор одновременно, у вас есть race condition.

условия гонки плохо, и вы должны защищать от них с помощью какой-то из блокировки, например, с помощью a mutex.

+0

Спасибо, что mush.using mutex очистил ошибку; –

Смежные вопросы