在GNU C中,deos主线程调用构造函数?
我libhello.so使用hello.c文件创建www.example.com库文件,并使用GCC运行main.c文件。结果是在hello.c构造函数和主函数中打印线程id是相同的。
这是一个正确的功能吗?我在网上找不到确切的信息。
// hello.c
#include <stdint.h>
#include <pthread.h>
#include <stdio.h>
void __attribute__((constructor)) func(void)
{
uint64_t thread_id = pthread_self();
printf("in constructor, thread id: %lu\n", thread_id);
return;
}
void hello(void)
{
printf("hello\n");
return;
}
个字符
1条答案
按热度按时间mrzz3bfm1#
用constructor属性标记的函数在包含它们的(共享)对象被加载和初始化时由C运行时调用。对于进程可执行文件和所有直接链接到它的库,这发生在输入 *
main
之前,并且偶然发生在同一个线程中,最终将用于调用main
。对于在运行时使用
dlopen
加载的共享对象/动态库,静态构造函数通常由进行dlopen
调用的同一线程调用。请注意,这一切都是偶然的,而不是一成不变的!实现者将来可能会将构造函数的执行分派给单独的线程,并在调用线程中等待结果。