![](/img/trans.png)
[英]Is there a way, in C, to ensure a function is called only once without pthread_once?
[英]passing function as argument to pthread_once
我正在嘗試使用pthread_once初始化一些代碼。 但是通過調用init_routine()
{1}導致編譯時警告-警告:從不兼容的指針類型傳遞'pthread_once'的參數2,而使用
{2}不發出任何警告
在file1.c中
int init_routine (void) {
// initialize variables
}
在file1.h中
int init_routine(void);
現在我將file1.h包含在file2.c中
在file2.c中
#include "file1.h"
pthread_once_t prog_inited = PTHREAD_ONCE_INIT;
int start() {
...
pthread_once(&prog_inited, &init_routine); <-- {1}
pthread_once(&prog_inited, (void *)init_routine); <-- {2}
...
return 0;
}
這些有什么區別?
謝謝。
(回答更新的問題)在頭文件中,您需要更改:
int init_routine(void);
至
void init_routine(void);
而且對pthread_once
的調用不需要init_routine
之前的&
:
pthread_once(&prog_inited, init_routine);
但是您最初擁有的是:
pthread_once(&prog_inited, (void *)init_routine);
正如cnicutar指出的那樣,它並不是嚴格的合法C代碼,但它仍應適用於當今幾乎所有常用的編譯器。 例如, gcc
僅在使用-pedantic
開關時才會發出警告。
調用pthread_once的正確語法是:
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
因此,在您的情況下,呼叫應為:
pthread_once(&prog_inited, init_routine);
實際上, (void *)
並不是必需的並且是錯誤的,因為(void *)
不是函數指針類型,並且按照標准,您不可以這樣強制轉換!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.