Мой код делает меня сумасшедшим, так как иногда он работает нормально, но иногда возникает ошибка сбрасывания ядра или сегментации или двойной ошибки (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)
и получить ошибка иногда, и это не происходит всегда.
Пожалуйста, уменьшите код до минимального, но полного примера. Также ознакомьтесь с инструкциями по публикации этого сайта. –
Вы можете * попытаться поймать крах в действии, запустив свою программу в отладчике. Отладчик остановится в месте сбоя и позволит вам просмотреть переменные и их значения, и, самое главное, позволить вам изучить и * подойти * стек вызовов функций, чтобы вы могли перейти к вашему коду (если отладчик не сделал этого, t остановить код уже). Если вы все еще не можете понять это сами, то по крайней мере сообщите нам, где в вашем коде произошел сбой. –
Кроме того, почему вы смешиваете C и C++ так много? Если вы программируете на C++, вы должны использовать классы и операторы C++. Поэтому вместо использования, например, 'malloc' для выделения памяти вы должны использовать оператор' new'. В вашем коде есть и другие проблемные вещи, например использование 'while (! Fin.eof())', которое почти всегда неверно, и использование большего количества указателей, чем обычно здоровые (и проблемы с указателями очень распространены, когда речь идет о сегментации неисправности). Вы также можете проверить ['std :: thread'] (http://en.cppreference.com/w/cpp/thread/thread). –