互斥保护宏
Mutex Protect Macro
这是我在这个社区的第一篇帖子,所以请多多包涵。
有没有办法在宏本身中互斥保护宏。
例如,
#define FUNCTION_ \
doSomething()
基本上,我想做这样的事情
#define FUNCTION_ \
mutex.lock \
doSomething() \
mutex.unlock
有关更多信息,宏都在头文件中单独声明(没有命名空间或 class),它处理对 API 的调用。我们正在使用 C++。该头文件被多个项目使用,因此不可能对宏本身进行全面检查。有关宏的更多详细信息,它包装了对 log4CXX 的调用。log4CXX 是线程安全的;但是,同时进行写调用的两个使用此宏的线程不是线程安全的。当 运行 Valgrind 对此抱怨时,Helgrind 会抱怨。代码中的互斥锁保护宏解决了这个问题,但是不是每次调用都使用互斥锁保护,而是让宏保护它自己的调用。
您有密码。只是掩盖它。
应该这样做:
#define FUNCTION_ \
do { \
mutex.lock() \
doSomething() \
mutex.unlock() \
} while(0)
如果你已经有了这个
#define FUNCTION_ \
doSomething()
如果真的没有机会阻止这种宏观疯狂,那么至少不要更进一步。如果您需要 doSomething()
中的锁,那么最简单的方法是获取函数中的锁:
void doSomething() {
mutex.lock();
/* .... */
mutex.unlock();
}
或者如果由于某种原因您无法更改函数,则包装它
#define FUNCTION_ \
doSoemthingLocked()
void doSomethingLocked() {
mutex.lock();
doSomething();
mutex.unlock();
}
(如果您需要将它放在 header 中,则可能声明为内联,并且可能将对互斥锁的引用作为参数传递)
问题解决方法如下:
#define FUNCTION_ \
{ \
mutex.lock(); \
doSomething(); \
mutex.unlock(); \
} \
但是,对于互斥锁本身,我有一个包装 pthread_mutex_t 的互斥锁,所以在这种情况下,我将互斥锁声明为:
extern Mutex 互斥;
然后在 .cpp 文件中:
#include <headerFile.hpp>
Mutex mutex;
这会创建互斥锁的单个实例,并防止发现多个同名实例的问题。
这是我在这个社区的第一篇帖子,所以请多多包涵。
有没有办法在宏本身中互斥保护宏。
例如,
#define FUNCTION_ \
doSomething()
基本上,我想做这样的事情
#define FUNCTION_ \
mutex.lock \
doSomething() \
mutex.unlock
有关更多信息,宏都在头文件中单独声明(没有命名空间或 class),它处理对 API 的调用。我们正在使用 C++。该头文件被多个项目使用,因此不可能对宏本身进行全面检查。有关宏的更多详细信息,它包装了对 log4CXX 的调用。log4CXX 是线程安全的;但是,同时进行写调用的两个使用此宏的线程不是线程安全的。当 运行 Valgrind 对此抱怨时,Helgrind 会抱怨。代码中的互斥锁保护宏解决了这个问题,但是不是每次调用都使用互斥锁保护,而是让宏保护它自己的调用。
您有密码。只是掩盖它。 应该这样做:
#define FUNCTION_ \
do { \
mutex.lock() \
doSomething() \
mutex.unlock() \
} while(0)
如果你已经有了这个
#define FUNCTION_ \
doSomething()
如果真的没有机会阻止这种宏观疯狂,那么至少不要更进一步。如果您需要 doSomething()
中的锁,那么最简单的方法是获取函数中的锁:
void doSomething() {
mutex.lock();
/* .... */
mutex.unlock();
}
或者如果由于某种原因您无法更改函数,则包装它
#define FUNCTION_ \
doSoemthingLocked()
void doSomethingLocked() {
mutex.lock();
doSomething();
mutex.unlock();
}
(如果您需要将它放在 header 中,则可能声明为内联,并且可能将对互斥锁的引用作为参数传递)
问题解决方法如下:
#define FUNCTION_ \
{ \
mutex.lock(); \
doSomething(); \
mutex.unlock(); \
} \
但是,对于互斥锁本身,我有一个包装 pthread_mutex_t 的互斥锁,所以在这种情况下,我将互斥锁声明为:
extern Mutex 互斥;
然后在 .cpp 文件中:
#include <headerFile.hpp>
Mutex mutex;
这会创建互斥锁的单个实例,并防止发现多个同名实例的问题。