【问题标题】:Dynamic memory allocation and multithreading动态内存分配和多线程
【发布时间】: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


【解决方案1】:

如果您要分配大量相同类型的对象,一种方法是pool 对象。假设您有一个 treeNode_t 结构。让每个线程都有自己的“免费”treeNode_t 对象链表。您的代码可以将节点放到调用线程的空闲列表中,而不是调用free(treeNode)。而且,在调用malloc() 之前,您首先要检查空闲列表,如果有可用的节点,则从那里获取一个节点。只有在空闲列表为空时才调用malloc()获取节点。


但首先...

确定您得到的“不正确”结果是因为malloc()free() 在您的多线程版本中无法正常工作吗?如果这确实是的问题,那么另一种可能性是您使用了错误的库。如果您的构建工具允许您编写多线程代码而不给您线程安全的malloc()free(),我会感到非常惊讶,但也许您必须指定一些编译时间或链接时间选项才能获得库的线程安全版本。

【讨论】:

    【解决方案2】:

    当然可以为特定线程分配内存。您可以从任何线程调用malloc

    如果您不需要跨线程共享该数据,这就是您需要做的一切。

    【讨论】:

    • new 不是 C。而关于“如果您不需要跨线程共享该数据”,OP 明确表示它需要支持多线程环境中的并行化。你能澄清一下你的措辞吗?
    • @ryyker 线程中的并行化并不意味着共享。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2012-01-13
    • 2020-04-21
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多