C 静态函数在多线程和内核程序中有什么用途?

C 静态函数在多线程和内核程序中有什么用途?,c,linux,multithreading,linux-kernel,C,Linux,Multithreading,Linux Kernel,在上一次采访中,我遇到了一个问题,比如“静态函数在多线程程序和内核程序中有什么用途?”。我回答说,函数不能从该文件外部调用,因此我们可以在其他文件中重用相同的函数名。EXPORT_符号用于访问内核外的程序 但他对此并不满意。谈到多线程和内核代码,还有其他用途吗?我想不出静态函数和多线程之间有什么关系。我经常看到使用static void*函数(而不是普通的void*函数)作为pthread\u create的参数是一种很好的做法。为了防止人们错误地调用它,并且在其他地方需要它时,可以将它作为指向

在上一次采访中,我遇到了一个问题,比如“静态函数在多线程程序和内核程序中有什么用途?”。我回答说,函数不能从该文件外部调用,因此我们可以在其他文件中重用相同的函数名。EXPORT_符号用于访问内核外的程序


但他对此并不满意。谈到多线程和内核代码,还有其他用途吗?

我想不出静态函数和多线程之间有什么关系。我经常看到使用
static void*
函数(而不是普通的
void*
函数)作为
pthread\u create
的参数是一种很好的做法。为了防止人们错误地调用它,并且在其他地方需要它时,可以将它作为指向函数的指针传递。但实际上就是这样,我甚至不确定它是否在pthread文档中被认为是良好的实践(在
manpthread\u create
中的示例当然使用了
static void*
函数),但是您经常会在start\u例程中使用静态变量,以便所有线程都可以轻松地共享它们。这通常意味着start_例程是一个静态函数。也许面试官的关键点是静态函数不能从另一个源文件调用,而不是另一个源文件可以使用相同的函数名。我不确定这与多线程有什么关系,因为c函数本质上是可重入的,只要这些函数不包含任何“不受保护”的静态变量,就可以从多线程调用。在“旧时代”,函数被声明为静态的,以减少链接器符号表开销和生成时间,尽管在进行调试生成时,静态名称仍然会进入调试信息。关于静态函数的另一点是,编译器可以对源文件执行“全局”优化,因为没有外部(源文件的)优化对静态函数的引用。同样,这与多线程无关,因为您可以将单个源文件用于多线程。我想不出静态函数和多线程之间的任何关系。我经常看到使用
static void*
函数(而不是普通的
void*
函数)作为
pthread\u的参数,创建
作为良好实践。为了防止人们错误地调用它,并且在其他地方需要它时,可以将它作为指向函数的指针传递。但实际上就是这样,我甚至不确定它是否在pthread文档中被认为是良好的实践(在
manpthread\u create
中的示例当然使用了
static void*
函数),但是您经常会在start\u例程中使用静态变量,以便所有线程都可以轻松地共享它们。这通常意味着start_例程是一个静态函数。也许面试官的关键点是静态函数不能从另一个源文件调用,而不是另一个源文件可以使用相同的函数名。我不确定这与多线程有什么关系,因为c函数本质上是可重入的,只要这些函数不包含任何“不受保护”的静态变量,就可以从多线程调用。在“旧时代”,函数被声明为静态的,以减少链接器符号表开销和生成时间,尽管在进行调试生成时,静态名称仍然会进入调试信息。关于静态函数的另一点是,编译器可以对源文件执行“全局”优化,因为没有外部(源文件的)优化对静态函数的引用。同样,这与多线程无关,因为您可以将一个源文件用于多个线程。