Ниже приведен фрагмент более крупной программы и выполняется с использованием Pthreads.Список Iterator из библиотеки STL не работает
UpdateFunction читает из текстового файла. Функция FunctionMap используется только для вывода (ключ, 1). Здесь существенно обновляются функции UpdateFunction и FunctionMap для разных потоков.
queue <list<string>::iterator> mapperpool;
void *UpdaterFunction(void* fn) {
std::string *x = static_cast<std::string*>(fn);
string filename = *x;
ifstream file (filename.c_str());
string word;
list <string> letterwords[50];
char alphabet = '0';
bool times = true;
int charno=0;
while(file >> word) {
if(times) {
alphabet = *(word.begin());
times = false;
}
if (alphabet != *(word.begin())) {
alphabet = *(word.begin());
mapperpool.push(letterwords[charno].begin());
letterwords[charno].push_back("xyzzyspoon");
charno++;
}
letterwords[charno].push_back(word);
}
file.close();
cout << "UPDATER DONE!!" << endl;
pthread_exit(NULL);
}
void *FunctionMap(void *i) {
long num = (long)i;
stringstream updaterword;
string toQ;
int charno = 0;
fprintf(stderr, "Print me %ld\n", num);
sleep(1);
while (!mapperpool.empty()) {
list<string>::iterator it = mapperpool.front();
while(*it != "xyzzyspoon") {
cout << "(" << *it << ",1)" << "\n";
cout << *it << "\n";
it++;
}
mapperpool.pop();
}
pthread_exit(NULL);
}
Если я добавить время (! Mapperpool.empty()) в UpdateFunction то это дает мне идеальный выход. Но когда я перехожу обратно в FunctionMap, это дает мне странный выход и Segfaults позже. Вывод при использовании в UpdateFunction: Распечатать меня 0 курс крышка класс культуры класс Колпачок курс курс крышка культура параллелизм .....
[Каждое слово в отдельной строке]
Выход при использовании в FunctionMap (снимок выше): Распечатать 0 UPDATER DONE !! (курс% 0 + 0 @ + 0 + 05P + 0 cap% + 0 + 0, 05 + 0 class5P? 0 xyzzyspoon% + 0 + 0 (+ 0% P, 0 ,�0�,�05+�0����class%p,�0�,�0-�05�,�0����cap%�,�0�,�0X-�05�,�0����course%-�0 -�0�-�050-�0����course%
- 0p- 0 - 05 - 0 cap% - 0 - 0H . 05 - 0 culture% . 0. 0 . 05 . 0 concurrency% P. 0`. 0 . 05p. 0 course% . 0 . 08/05 . 0 cap% . 0/0/05/0 Неисправность сегрегации (сбрасываемая сердцевина)
Как сделать Я исправляю эту проблему?
'while (* it! =" Xyzzyspoon ") it ++' Это очень подозрительно. Вам нужно как-то проверить конец списка. Кто гарантирует, что список содержит указанную строку? – bolov
Список определенно не содержит эту строку. И даже если это так, я должен по крайней мере получить первые несколько символов, которых я не знаю. –