为什么线程创建方法需要参数?

s_b*_*s_b 2 c c++ multithreading

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

只有当arg位于堆中时,这才能"安全"工作,然后再次创建堆变量会增加清理已分配内存的开销.如果提供堆栈变量作为arg,则结果最多是不可预测的.

这对我来说看起来像是半熟的解决方案,还是我错过了API的一些微妙方面?

Mat*_*ner 5

语境.

许多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 *接收被转换回来,struct MyFS *以便可以在预期的MyFS实例的上下文中处理调用.