编辑:通过将函数类型更改为int解决了该问题!
我正在使用GCC编译器在Linux上使用threads.h库编写一个多线程测试程序。一些网站建议我在创建线程要使用的函数时使用void。但是,使用void类型会导致一个警告和一个注意事项:main.c:6:28: warning: passing argument 2 of 'thrd_create' from incompatible pointer type [-Wincompatible-pointer-types]
和/usr/include/threads.h:79:53: note: expected 'thread_start_t' {aka 'int(*) (void*)} but argument is of '(void*)()'
。我有三个源文件:
主.c:
// . . .
int main() {
thrd_t job1;
thrd_create(&job1, tjob1, NULL);
thrd_join(job1, NULL);
// . . .
作业.h:
void tjob1();
void tjob2();
void tjob3();
和作业。c:
// . . .
void tjob1(void) {
system("date");
printf("Doing jobs...");
for(int i = 0; i < 50; i++) {
system("date");
}
}
// . . .
我是否应该关注注解和警告以及如何修复它?我尝试过将tjob 1设置为int void,这引发了一个错误,我尝试过将tjob 1修复为*tjob1
/&tjob1
,这也导致了错误。我尝试过找出tjob 1的理想类型以及如何将函数声明为int(*) (void*)
,但没有成功。因为这是thrd_start_t所接受的。
先谢谢你了
1条答案
按热度按时间vjrehmav1#
thrd_start_t
是int(*)(void*)
的typedef
,这意味着你的线程启动函数tjob1
有错误的签名。由于你显然不关心传递给它的参数(NULL
)或返回值,这样的重写应该足够了: