首页 > 解决方案 > 检索函数指针的返回值,该指针作为参数提供给其他函数

问题描述

这可能有点具体,但我想知道,如何返回一个......让我们先看看代码。

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 链接

标签: c

解决方案


首先,这实际上并没有调用函数:

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));

所有这些都是假设readBufferprintOutBuffer返回函数指针。如果没有,您只需将函数的名称和函数的参数传递给atomic_op,并且类型f需要与readBufferand的类型匹配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);

推荐阅读