问题描述
此示例:
#include <stdio.h>
#include <pthread.h>
__attribute__((weak)) int pthread_create( pthread_t*,const pthread_attr_t*,void*(*)(void*),void*);
int main()
{
if (pthread_create)
{
printf("This is multi-thread version!\n");
}
else
{
printf("This is single-thread version!\n");
}
return 0;
}
如果未链接到pthread库,它会以单线程模式运行,但如果使用#include pthread
,则可以正常编译吗?
我认为pthread
在glibc
或libc
中,但是首先有一种方法可以链接排除标准库的文件,如果可以的话,什么时候可以这样做?
如果有可以在多线程模式下运行的代码,那么是否像示例中那样在单线程模式下运行它是否有意义?如果是这样,在弱符号中对硬编码进行编码的更好示例是什么?
解决方法
但是使用#include pthread是不是如果正常编译就可以链接?
否,包括头文件与链接库不同。
我认为pthread在glibc或libc中
不是。
有一种方法可以链接标准库以外的
检查您的编译器文档。 gcc
的{{3}}类似于-nolibc
-nostdlib
nodefaultlibs
。
如果是的话,什么时候可以这么做?
当我为确实没有C库的裸机目标进行编译时。当我编写自己的标准库或要使用其他C库时,默认的C库随系统一起分发,或者当进行交叉编译时,我在自定义位置有一个自定义C库,而系统未随交叉编译器一起提供。等等
如果有可以在多线程模式下运行的代码,那么在单线程模式下运行它有没有意义呢?
是的。由于某些原因,与单线程相比(例如在单核系统上),多线程将导致较差的性能。万一拥有cpu的实时进程。或者如果特定算法不能是多线程的,或者在多线程时会导致较差的性能。