0

有什么方法可以编写一对用于获取和释放锁的宏,这样如果我可以离开一个函数而不释放之前在该函数中获取的锁,gcc 会警告我?

4

4 回答 4

2

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

请注意,如果您想在同一个函数中多次使用同一个宏对(例如,将它与两个锁一起使用),您将需要指定一个不同的变量名,这样您就不会得到关于重新的错误变量声明

于 2012-05-23T17:09:02.237 回答
1

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

在 C++ 中自然没有问题,您可以使用 RAII(在 d'tor 中解锁的自动对象)。

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

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

    // ...

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

} __finally {
    unlock(/* ... */);
}
于 2012-05-23T17:20:37.043 回答
0

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

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

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

于 2012-05-23T17:17:14.813 回答
0

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

void unlock(lock_t *);

您可以将您的锁声明为:

lock_t lock __attribute__((cleanup, unlock));

当然,C++ 方式更便于移植和理解。

于 2012-05-23T17:51:38.647 回答