用于确保释放锁的宏

时间:2012-05-23 17:00:25

标签: c gcc

有没有办法可以编写一对用于获取和释放锁定的宏,这样如果我可以在不释放之前在该函数中获取锁定的情况下离开函数,gcc会发出警告?

4 个答案:

答案 0 :(得分:2)

你可以声明一个变量而不在开始的宏中初始化它并初始化+在结束宏中使用它。如果你在gcc(-Wall?)中使用适当的设置,它应该警告你声明的但不是初始化的变量。

请注意,如果要在同一个函数中多次使用相同的宏对(例如,使用两个锁),则需要指定一个不同的变量名,这样就不会出现错误关于重新声明变量

答案 1 :(得分:1)

假设你的函数(范围)可能有多个return语句--AFAIK没有传统方法可以做到这一点。

当然,在C ++中没有问题,你可以使用RAII(一种自动解锁的自动对象)。

如果您为Windows编写代码 - 您可以使用SEH包装器来确保资源释放。它也可以正常使用异常(包括C ++和SEH)。

__try
{
    lock(/*...*/);

    // ...

    if (/* ... */)
        return;

} __finally {
    unlock(/* ... */);
}

答案 2 :(得分:0)

我想不出让编译器为你强制执行它的任何方法,但总是可以使用宏而不是return关键字。像这样:

#define RETURN(x) { if (locked()) unlock();  return x; }

那就是说,我个人讨厌这样的宏,但这是一个选择。

答案 3 :(得分:0)

GCC提供了cleanup属性,当变量超出范围时,该属性调用函数。如果你有解锁功能:

void unlock(lock_t *);

您可以将锁定声明为:

lock_t lock __attribute__((cleanup, unlock));

当然,C ++方式更易于理解。