有什么方法可以编写一对用于获取和释放锁的宏,这样如果我可以离开一个函数而不释放之前在该函数中获取的锁,gcc 会警告我?
问问题
253 次
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 回答