gpt4 book ai didi

c++ - 为什么线程创建方法需要一个参数?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:50 24 4
gpt4 key购买 nike

Windows 中的所有线程创建方法(如 pthread_create() 或 CreateThread())都希望调用者提供指向线程 arg 的指针。这不是本质上不安全吗?

仅当 arg 在堆中时,这才能“安全”地工作,然后再次创建堆变量增加了清理分配内存的开销。如果将堆栈变量作为 arg 提供,那么结果充其量是不可预测的。

这对我来说似乎是一个半生不熟的解决方案,还是我遗漏了 API 的一些微妙方面?

最佳答案

上下文。

许多 C API 提供额外的 void *参数,以便您可以通过第三方 API 传递上下文。通常,您可以将一些信息打包到一个结构中,并将该变量指向该结构,这样当线程初始化并开始执行时,它拥有比它开始的特定函数更多的信息。没有必要将此信息保存在给定的位置。例如,您可能有几个字段告诉新创建的线程它将在做什么,以及它可以在哪里找到它需要的数据。此外,不要求 void *实际上用作指针,它是一个无类型的参数,在给定的体系结构上具有最合适的宽度(指针宽度),任何东西都可以用于新线程。例如,您可能会传递 int直接如果 sizeof(int) <= sizeof(void *) : (void *)3 .

作为这种风格的相关示例:我目前正在处理的 FUSE 文件系统首先打开一个文件系统实例,比如 struct MyFS .在多线程模式下运行 FUSE 时,线程会到达一系列 FUSE 定义的调用以处理 open , read , stat等。当然,这些对我的文件系统的实际细节没有预先的了解,所以这是在 fuse_main 中传递的。函数 void *论据旨在用于此目的。 struct MyFS *blah = myfs_init(); fuse_main(..., blah); .现在,当线程到达上述 FUSE 调用时,void * received 被转换回 struct MyFS *以便可以在预期的 MyFS 实例的上下文中处理调用。

关于c++ - 为什么线程创建方法需要一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3518703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com