随着custom_t = init_custom();
您尝试设置类型名(即custom_t
)。
就叫它别的吧:
custom_t my_global_custom = init_custom();
但是,要从多个线程和库函数中访问它,假设您需要写入它,您需要将对此的访问包装在互斥锁中:
pthread_mutex_t custom_mutex = PTHREAD_MUTEX_INITIALIZER;
custom_t my_global_custom;
my_global_custom = init_custom();
// how each thread must access it
pthread_mutex_lock(&custom_mutex);
func_that_uses_my_global_custom();
pthread_mutex_unlock(&custom_mutex);
更新:
我的示例并不是字面意义上的初始化程序,而是一个赋值:
pthread_mutex_t custom_mutex = PTHREAD_MUTEX_INITIALIZER;
custom_t my_global_custom;
custom_t my_global_2;
custom_t
init_custom(void)
{
custom_t temp;
temp.val1 = 5;
temp.val2 = 5;
return temp;
}
void
init_custom2(custom_t *temp)
{
temp->val1 = 5;
temp->val2 = 5;
}
int
main(void)
{
// either one of these should work ..
my_global_custom = init_custom();
init_custom2(&my_global_2);
// start some threads ...
return 0;
}
void *
thread_func(void *)
{
// how each thread must access it:
pthread_mutex_lock(&custom_mutex);
func_that_uses_my_global_custom();
pthread_mutex_unlock(&custom_mutex);
return (void *) 0;
}
更新#2:
但是您知道在主函数之外初始化 my_global_custom 的任何方法吗?或者那是不可能的?
gcc
[至少]另一种方法是创建一个构造函数。鉴于上述函数和定义,将 init 调用移至:
void __attribute__((constructor))
my_global_constructor(void)
{
my_global_custom = init_custom();
init_custom2(&my_global_2);
}
没有什么需要[也不应该]调用这个函数。它会在被调用之前 main
被自动调用,因为它现在是一个特殊的函数。
这些通常由想要进行一些初始化的库使用,但不想承担必须知道调用的负担(例如)在 这种情况下,它在库的“正确”时间被调用[基于链接, ETC。]。main
init_liba(); init_libb(); ...
还有一个__attribute__((destructor))
比可以用来“破坏”东西[main
返回后,IIRC]。
有关这方面的更多信息,请参阅:__attribute__((constructor)) 究竟是如何工作的?
就个人而言,我现在使用上面的属性,但是,为了怀旧,我喜欢旧的.init/.fini
部分。