Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的多线程程序-不兼容指针类型的赋值_C_Multithreading - Fatal编程技术网

C中的多线程程序-不兼容指针类型的赋值

C中的多线程程序-不兼容指针类型的赋值,c,multithreading,C,Multithreading,在Unix环境中,尝试将输出设置为类似以下内容: 线程0-0,线程1-0,线程2-0,线程2-1,线程2-2, 线程3-0 我确信main()很好,但这是我第一次使用函数指针。我可能犯了一些明显的错误。总之…帮助 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> struct thread_data { int id

在Unix环境中,尝试将输出设置为类似以下内容:

线程0-0,线程1-0,线程2-0,线程2-1,线程2-2, 线程3-0

我确信main()很好,但这是我第一次使用函数指针。我可能犯了一些明显的错误。总之…帮助

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
struct thread_data {
    int id;
};

typedef int (*Start) (void runner(void *), struct thread_data *params, pthread_t *thread);
typedef int (*Join) (int id); 

typedef struct _Thread {
    pthread_t id;
    Start start;
    Join join;
} Thread;

void runner();
int *start(void runner(void *), pthread_t* params, Thread *thread); 
int *join(int id);

int main(int argc, char *argv[]) {
    srand(time(0));

    int i, num = 4;
    struct thread_data params[num];
    for (i=0; i<num; i++) params[i].id = i;

    Thread thread[num];
    for (i=0; i<num; i++) {
        thread[i].start = start;
        thread[i].join = join;
    }

    for (i=0; i<num; i++) {
        thread[i].start(runner, &params[i], &thread[i].id);
    }

    for (i=0; i<num; i++) {
        thread[i].join(thread[i].id);
    }

    pthread_exit(NULL);
    return 0;
}
void runner(){
        struct thread_data *data;
        int i;
        for (i = 0; i < 10; i++){
                printf("Thread %d - %d\n", data->id, i);
                sleep((int) (rand()%2));
        }
}
int *start(void runner(void *), pthread_t* params, Thread *thread){
    pthread_create(&thread->id, NULL, runner(void *), &params);
}

int *join (int id){ 
    pthread_join(id, NULL); //thread->id, NULL)
}
30和31是螺纹[i]。。。1和51是最后一个

Thread thread[num];
for (i=0; i<num; i++) {
    thread[i].start = start;
    thread[i].join = join;
}

int *start(void runner(void *), pthread_t* params, Thread *thread){
    pthread_create(&thread->id, NULL, runner(void *), &params);
}
Thread-Thread[num];
对于(i=0;iid,NULL,runner(void*),¶ms);
}
  • 函数指针将返回
    int
    ,而函数返回
    int*

    实际上存在类型不匹配,您也可以

    • 将函数类型定义更改为返回
      int*

      typedef int *(*Start) (void runner(void *), struct thread_data *params, pthread_t *thread);
      typedef int *(*Join) (int id); 
      
    • 或修复函数以返回
      int

      int start(void runner(void *), pthread_t* params, Thread *thread); 
      int join(int id);
      
    这取决于你真正需要什么

  • 您的
    runner
    参数显然是另一个函数指针,但它并不是这样声明的,您必须通过编写类似

    typedef int *(*Start) (void (*runner)(void *), ... )
    
    相反

    当然也要修正定义


  • 您是否介意提取第30行、第31行和第51行,或者指出它们是哪一行。当然,此警告与程序是多线程的事实无关。SO代码块中没有行号。请编辑您的问题以显示错误的位置(代码中有注释)。请注意,您同时声明了
    start
    join
    以返回值,但从未声明过。这会导致未定义的行为。更不用说在
    runner
    函数中有一个指针
    data
    ,一个从未初始化但仍然取消引用的指针。
    typedef int *(*Start) (void (*runner)(void *), ... )