每当我尝试编译以下程序时,我都会从编译器(g ++ 4.4.3)获得此消息。有什么想法,为什么?
main.cpp: In function ‘int main(int, char**)’:
main.cpp:52: error: void value not ignored as it ought to be
第52行的代码为 rc = pthread_create_with_stack(& thread [t],BusyWork,t);
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM_THREADS 4
void *stackAddr[NUM_THREADS];
pthread_t thread[NUM_THREADS];
pthread_attr_t attr;
void *BusyWork(void *t)
{
int i;
long tid;
double result=0.0;
tid = (long)t;
printf("Thread %ld starting...\n",tid);
for ( i = 0; i < 1000; i++)
{
result = result + sin(i*tid) * tan(i*tid);
}
printf("Thread %ld done. Result = %e\n", tid, result);
pthread_exit((void*) t);
}
void pthread_create_with_stack( pthread_t * pthread, void *(*start_routine) (void *), int tid )
{
const size_t STACKSIZE = 0xC00000; //12582912
int rc;
size_t i;
pid_t pid;
stackAddr[tid] = malloc(STACKSIZE);
pthread_attr_setstack(&attr, stackAddr[tid], STACKSIZE);
rc = pthread_create( pthread, &attr, start_routine, (void*)0 );
}
int main (int argc, char *argv[])
{
int rc;
long t;
void *status;
/* Initialize and set thread detached attribute */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for(t=0; t<NUM_THREADS; t++)
{
printf("Main: creating thread %ld\n", t);
// The following line is the line 52, where error occurs
rc = pthread_create_with_stack( &thread[t], BusyWork, t );
if (rc)
{
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
/* Free attribute and wait for the other threads */
pthread_attr_destroy(&attr);
for(t=0; t<NUM_THREADS; t++)
{
rc = pthread_join(thread[t], &status);
if (rc)
{
printf("ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
printf("Main: completed join with thread %ld having a status"
"of %ld\n",t,(long)status);
}
printf("Main: program completed. Exiting.\n");
pthread_exit(NULL);
}
答案 0 :(得分:10)
pthread_create_with_stack
会返回void
,但您尝试在void
中保存此int
“值”,这是一个错误。
答案 1 :(得分:5)
就是这一行
rc = pthread_create_with_stack( &thread[t], BusyWork, t );
pthread_create_with_stack的定义是void类型。应为void *类型并返回rc,即pthread_create()的结果。
由于pthread_create_with_stack是一个void函数,并且它在定义中没有返回任何内容,因此将rc设置为其返回值不仅没有意义,而且gcc / g ++甚至不允许您尝试编译,这是一个错误。
答案 2 :(得分:2)
是的,有错误。返回类型void
表示函数不返回任何值。您尝试将pthread_create_with_stack
的返回值分配给局部变量,但没有要分配的返回值。
您应该将pthread_create_with-stack
声明为返回int
,然后让它实际返回一个值:
int pthread_create_with-stack(...)
{
...
return pthread_create(...);
}
答案 3 :(得分:0)
您从void
函数获取返回值并尝试将其分配给变量。 pthread_create_with_stack
不返回任何内容;不要分配或使用它。
答案 4 :(得分:0)
您的pthread_create_with_stack
是void
功能。它不返回值。您无法将其结果分配给变量。
答案 5 :(得分:0)
pthread_create_with_stack被定义为返回void。
rc = pthread_create_with_stack( &thread[t], BusyWork, t );
其中rc定义为int不合法
答案 6 :(得分:0)
虚空仅仅意味着&#34;没有&#34; 你只是不能保存&#34;什么都没有&#34;!