互斥保护宏

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;

这会创建互斥锁的单个实例,并防止发现多个同名实例的问题。