以下是較大程序的一個片段,它使用Pthreads完成。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);
}
如果我在UpdateFunction中添加while(!mapperpool.empty()),那麼它會給我提供完美的輸出。但是當我將它移回FunctionMap時,它會在稍後給我一個奇怪的輸出和Segfaults。在UpdateFunction使用時 輸出: 打印我0 當然 帽 類 培養 類 帽 當然 當然 帽 培養 併發 .....
[每個在單獨的行中字]
當在FunctionMap中使用時輸出(片段如上所示): 打印0 更新完成! (當然%0 + 0 @ + 0 + 05P + 0cap%+ 0 + 0,05 + 0class5P?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 (核心轉儲)
如何做到這一點?我解決了這個問題嗎?
'while(* it!=「xyzzyspoon」)it ++'這非常可疑。您需要以某種方式檢查列表的結尾。誰保證列表包含指定的字符串? – bolov
該列表絕對不包含該字符串。即使是這樣,我也應該至少得到正確的前幾個字符,而不是。 –