![](/img/trans.png)
[英]invalid conversion from void* to void(*)(void*)[-fpermissive]
[英]Passing arguments to pthread_create - invalid conversion from void(*)() to void(*)(void*)
我正在编写一个小的简单程序,该程序使用pthreads实现循环执行计划。 我首先编写了没有pthreads的程序,现在尝试将参数正确地传递到pthread_create中。 我知道args是:
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 *
的虚拟参数,一切都应该正常。
使用以下内容:
typedef void* (*ThreadFunc_t) (void *);
ThreadFunc_t ttable[SLOTX][CYCLEX] = {
{one, one, two, two},
{three, three, three, three},
{two, two, one, one},
{burn, two, two, burn},
{three, three, three, three},
{one, one, two, two}
};
...
rc = pthread_create(&thread[i], NULL, (ttable[slot][cycle]), (void*)i);
如果使用pthread_ctreate,则必须遵循其接口:int pthread_create(pthread_t * restrict tidp,const pthread_attr_t * restrict_attr,void *(* start_rtn)(void *),void * restrict arg);
希望对您有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.