我正在尝试使用pthread
库来计算n
斐波纳契数,其中n
可以来自范围0-1000
。当我尝试将void*
强制转换为double
时,我遇到了一个奇怪的错误。
在我的主要部分是我对计算斐波那契函数的调用:
pthread_create(&tid, &attr, calc_fib, (void *)n);
在我的calc_fib
函数中,我试图用:
void *calc_fib( void *num)
{
double n;
n = (double)num;
...
但是,当我尝试这样做时,我会收到以下错误:
In function ‘calc_fib’:
error: pointer value used where a floating point value was expected
In function ‘main’:
error: cannot convert to a pointer type
我无法在C中从void*
转换为double
,或者我只是做错了吗?
答案 0 :(得分:12)
void *num
是一个指针。 double n
是一个变量。
您可以将void*
投射到double*
:
double *p = (double *)num;
然后你取消引用它:
double n = *p;
或者在一行中:
double n = *(double *)num;
答案 1 :(得分:2)
首先,您要将void *转换为double *。然后,您需要取消引用指针以将其指定为double。
void *calc_fib( void *num)
{
double n;
n = *(double*)num;
...
答案 2 :(得分:1)
您无法将double
移植到指针 - 对于开始,指针类型可能没有足够的位。
如果在调用n
后main
中pthread_create
不会更改,则可以在n
本身传递指向main
变量的指针(即(void*)&n
,然后在*(double*)num
内使用calc_fib
。
如果n
可能会改变 - 也许你有一个循环计算各种n值以传递给你产生的不同线程 - 那么你必须避免竞争条件,其中新线程可能没有读过之前的值主线程替换它。你可以使用一个互斥量 - 它意味着需要一个固定数量的内存而不管线程数 - 但代码相对冗长,它进一步串行化并减慢了线程的启动速度。通常更好的方法是将每个值放入单独的内存地址中。您可以使用具有与新线程一样多的值的数组,或者为每个double
在堆上分配内存然后让线程读取然后释放该内存....