c - 检索函数指针的返回值,该指针作为参数提供给其他函数
问题描述
这可能有点具体,但我想知道,如何返回一个......让我们先看看代码。
void *atomic_op(void * (*f)(),void* ret) // Using a function pointer to encapsulate the procedure in between locks
{
pthread_mutex_lock(&mut1);
ret = f;
pthread_mutex_unlock(&mut1);
}
我希望能够获取的返回值f
并将其存储到ret
使用 void 指针以进行更一般的使用。我的 IDE 通知我argument ret
在这个函数的范围之外没有被访问,但后来我的代码有
char* temp;
while (1)
{
atomic_op(readBuffer(shared_array),temp);
if (*temp == 0)
{
break;
}
atomic_op(printOutBuffer(shared_array),NULL);
}
在运行整个过程时,IDE 是我们的权利(当然),但我不明白为什么。
整个事情都是对监视器的尝试,2个线程在消费者生产者关系中共享一个数组(只是在试验),我偶然发现了这个,我发现这真的很奇怪!
有人可以解释这里发生了什么吗?
整件事都在这里https://controlc.com/2af8f50c
与 pthread 链接
解决方案
首先,这实际上并没有调用函数:
ret = f;
它只是获取函数指针并将其分配给ret
. 调用你想要的函数f()
。
此外,由于 C 中的参数是按值传递的,因此对参数ret
的更改不会反映在调用函数中。指针类型这一事实ret
并不重要。
如果你想让一个函数更新一个指针值,它需要一个指向指针的指针。然后必须取消引用该指针到指针的参数以更新调用函数中的指针变量。
进行这些修复后,您的函数将如下所示:
void *atomic_op(void * (*f)(),void **ret)
{
pthread_mutex_lock(&mut1);
if (ret) {
*ret = f();
}
pthread_mutex_unlock(&mut1);
}
你会这样称呼它:
char *tmp;
void *tmp2;
atomic_op(readBuffer(shared_array),&tmp2);
tmp = tmp2;
这里需要额外的void *
变量,因为char **
不能保证 a 可以安全地转换为 a void **
。
还有一件事我们没有解决,那就是函数被定义为返回 avoid *
但实际上并没有返回任何东西。这对您的程序来说没问题,因为您没有尝试访问返回值,但它仍然是一种不好的代码气味。
最好取第二个参数的返回值,f
把它作为返回值,atomic_op
去掉第二个参数。这也意味着您不需要调用函数中的第二个变量。
所以现在我们有:
void *atomic_op(void * (*f)())
{
void *ret;
pthread_mutex_lock(&mut1);
ret = f();
pthread_mutex_unlock(&mut1);
return ret;
}
这将被称为:
char *tmp;
tmp = atomic_op(readBuffer(shared_array));
所有这些都是假设readBuffer
并printOutBuffer
返回函数指针。如果没有,您只需将函数的名称和函数的参数传递给atomic_op
,并且类型f
需要与readBuffer
and的类型匹配printOutBuffer
。那会给你:
void *atomic_op(void *(*f)(void *), void *param)
{
void *ret;
pthread_mutex_lock(&mut1);
ret = f(param);
pthread_mutex_unlock(&mut1);
return ret;
}
像这样调用:
char *tmp;
tmp = atomic_op(readBuffer, shared_array);
推荐阅读
- c++ - 如何在没有整洁警告的情况下使用工会?
- fastapi - 是否有一种 FastAPI 方法可以在全球范围内访问当前的请求数据?
- react-native - React Native:iOS 不是在 Xcode 中构建的
- apache-spark - 将 RDD 转换为 Spark DataFrame
- javascript - 单击特定按钮时无法触发 evt
- python - 以这两种不同的方式创建信号有什么区别?
- java - 在按钮上单击我想切换 TextView 的文本
- numpy - numpy:为什么你会使用乘法而不是 matmul 进行矩阵乘法?
- python - python2中无限while循环中的事件处理
- c++ - 与 c++ 中 RGB 子字符串问题的框架逻辑相关的问题