【发布时间】:2022-01-07 21:34:48
【问题描述】:
我有一个程序,它使用某种形式的树、哈希表和列表来查找两个文件之间的相似之处。基本上,它类似于倒排索引。程序运行良好,但我想使用多线程进行并行化。
我面临的问题是我想要并行化的部分,创建一个列表并在我拥有的树上进行一些搜索。这会导致不正确的结果。我知道我可以使用互斥锁并锁定特定部分,但这会导致时间改进为零。
所以,我的问题是。我可以为特定线程分配内存吗?如果我不能,我该如何解决这个问题?
跟随我想要并行化的部分。
List list;
HashTable tokenHash;
initializeList(list);
createHashTable(tokenHash);
char * token = strtok(cur_doc_str, " ");
while( token != NULL ) {
list = searchTokenAtStructs(token, tree, hash);
insertSearchedTokensToHashTable(tokenHash, token);
token = strtok(NULL, " ");
}
编辑:我是线程的新手并且迷路了,但最终通过一些调试我发现问题是strtok。它不是线程安全的。 strtok_r 似乎可以解决问题。
谢谢大家的回答。他们帮助我更好地理解线程。
【问题讨论】:
-
您可以在线程环境中使用组织成数组元素的单个内存块,只要您严格确定哪个线程可以访问内存块的哪个元素(see this question)但通常您会想了解相同资源共享的线程概念,例如:重入、信号量、临界区、令牌共享、互斥锁等。
-
如果你的线程正在搜索的树保证在线程处于活动状态时不会改变,那么线程可以同时读取它而不会出现任何问题。至于列表,您可以让每个线程创建自己的子列表,然后在最后(在您
pthread_join()'d 所有线程以确保它们不再运行之后)您的主线程可以附加所有子列表一起得到最终结果?
标签: c multithreading memory-management dynamic-memory-allocation strtok