c - 将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

标签 c multithreading parameter-passing argument-passing void-pointers

我正在编写一个使用 pthreads 实现循环执行计划的简单小程序。我首先编写了没有 pthreads 的程序,现在正试图将参数正确地传递给 pthread_create。 我知道参数是:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

但是将线程发送到 ttable(时间表)给我带来了困难。 现在我正在使用线程,我已经添加了 void* x 参数,即使我没有使用它(这个参数是必需的吗?)我已经尝试让计划不带任何参数,并将 NULL 作为 pthread_create 的最后一个参数传递。 我目前的错误是:错误:从'void (*)()'到'void(*)(void*)'的无效转换[-fpermissive] }; ^

代码如下:

#include <ctype.h>
#include <unistd.h>
#include <sys/times.h>
#include <pthread.h>

#define SLOTX   6
#define CYCLEX  4
#define SLOT_T  1000    //1 second slot time
#define NUM_THREADS 3

int tps;
int i;
int j;
int rc;
int cycle = 0;
int slot = 0;
struct tms n;

void one(void* x){
        printf("Task 1 running\n");
        sleep(1);
}

void two(void* x){
        printf("Task 2 running\n");
        sleep(1);
}

void three(void* x){
        printf("Task 3 running\n");
        sleep(1);
}

void burn(void* x){
        printf("Burn cycle\n");
        sleep(1);
}

void (*ttable[SLOTX][CYCLEX])(void* x) = {
        {one,   one,    two,    two},
        {three, three,  three,  three},
        {two,   two,    one,    one},
        {burn,  two,    two,    burn},
        {three, three,  three,  three},
        {one,   one,    two,    two}
};

main(){
        tps = sysconf(_SC_CLK_TCK);
        pthread_t thread[NUM_THREADS];
        printf("clock ticks/sec = %d\n\n", tps);
        while(1){
                printf("Starting new hyperperiod\n");
                for(slot = 0; slot<SLOTX; slot++){
                        printf("Starting new frame\n");
                        for(cycle = 0; cycle<CYCLEX; cycle++){
                                for(i = 0; i<NUM_THREADS; i++){
                                        rc = pthread_create(&thread[i], NULL, (*ttable[slot][cycle]), *(void*)j);
                                }
                        }
                }
        }

}

最佳答案

pthread_create 的启动函数必须恰好采用一个 void * 类型的参数。你的参数为零。修复它们以采用 void * 类型的虚拟参数,一切都应该没问题。

关于c - 将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19968556/

相关文章:

postgresql - DO 脚本中的 PSQL 命令行参数

c++ - 使用 boost::format 的 C++ 便捷日志记录语句

c++ - 从 C 使用 C++ 共享库

c - 2D FFTW 中的零困难

c++ - 时序图 : Thread processing over messages in queue

java - 同时创建新文件

java - 为什么我必须为二叉树的递归插入显式设置左/右子节点?

c - -finline-limit GCC 编译器选项的确切行为

c - 为什么我的 C 代码运行缓慢?

java - Android 主线程 Looper 关注点