在pthread_create中使用函数指针数组 - 接近初始化

时间:2016-03-25 16:08:29

标签: c arrays pointers pthreads function-pointers

编辑:这是在John Bollinger和alk的帮助下回答的。阅读下面的评论!对于任何想要阅读的人来说,我还在原始帖子的底部包含了修改后的代码

我尝试使用函数指针数组作为pthread_create中的函数参数发送,但是当我尝试编译时(使用:" gcc -std = c99 P1.c -lpthread"我收到以下错误:

P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]

func_ptr funcs [4] = {func0,func1,func2,func3};

P1.c:40:1:警告:(接近初始化' funcs [0]')[默认启用]

P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]

P1.c:40:1:警告:(接近初始化' funcs [1]')[默认启用]

P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]

P1.c:40:1:警告:(接近初始化' funcs [2]')[默认启用]

P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]

P1.c:40:1:警告:(接近初始化' funcs [3]')[默认启用]

我认为我的函数指针的typedef声明存在问题,但我无法确切地知道问题是什么。以下是相关的代码段:

void func0()
{ printf("A"); }

void func1()
{ printf("B"); }

void func2()
{ printf("C"); }

void func3()
{ printf("D"); }

typedef void* (*func_ptr)(void *);
func_ptr funcs[4] = {func0, func1, func2, func3};

int main(int argc, char *argv[])
{
    pthread_t pth[THREADCNT];

    for(int i =0; i < THREADCNT; i++)
            pthread_create(&pth[i], NULL, (funcs[i])(), NULL);

    for(int i =0; i < THREADCNT; i++)
            pthread_join(pth[i], NULL);
}

以下修订的工作代码

// changed these functions to void* with (void * pv) parameter to
// match the typedef (and also match the pthread_create parameter)
void* func0(void * pv)
{ printf("A"); }

void* func1(void * pv)
{ printf("B"); }

void* func2(void * pv)
{ printf("C"); }

void* func3(void * pv)
{ printf("D"); }

typedef void* (*func_ptr)(void *);
func_ptr funcs[4] = {func0, func1, func2, func3};

int main(int argc, char *argv[])
{
    pthread_t pth[THREADCNT];

    for(int i =0; i < THREADCNT; i++)
            pthread_create(&pth[i], NULL, funcs[i], NULL); 
// changed the funcs[i] because the function isn't called, the value is just passed as an argument

    for(int i =0; i < THREADCNT; i++)
            pthread_join(pth[i], NULL);

}

1 个答案:

答案 0 :(得分:2)

更改

void func0()

void * func0(void * pv)

(其他三个相同)

因为这是定义要保存的数组的类型,以及pthread_create()所期望的类型。

更改

pthread_create(&pth[i], NULL, (funcs[i])(), NULL);

pthread_create(&pth[i], NULL, funcs[i], NULL);

因为您不想调用funcs[i]但是要传递其值。