这是我在这个社区上的第一篇文章,所以请多多包涵。
有没有办法在宏本身中互斥保护宏。
例如,
#define FUNCTION_ \
doSomething()
基本上,我想做这样的事情
#define FUNCTION_ \
mutex.lock \
doSomething() \
mutex.unlock
有关更多信息,宏全部在头文件中单独声明(没有命名空间或类),它处理对 API 的调用。我们正在使用 C++。该头文件被多个项目使用,因此不可能对宏本身进行全面检查。有关宏的更多详细信息,它包装了对 log4CXX 的调用。log4CXX 是线程安全的;但是,同时进行写调用的两个使用此宏的线程不是线程安全的。 Helgrind 在运行 Valgrind 时对此提示。代码中的互斥锁保护宏解决了这个问题,但不是每次调用都使用互斥锁保护,而是让宏保护它自己的调用。
最佳答案
如果你已经有了这个
#define FUNCTION_ \
doSomething()
如果真的没有机会阻止这种宏观疯狂,那么至少不要更进一步。如果您需要在 doSomething()
中锁定,那么最简单的方法是在函数中获取锁定:
void doSomething() {
mutex.lock();
/* .... */
mutex.unlock();
}
或者如果由于某种原因你不能改变函数然后包装它
#define FUNCTION_ \
doSoemthingLocked()
void doSomethingLocked() {
mutex.lock();
doSomething();
mutex.unlock();
}
(如果您需要将它放在标题中,则可能声明为内联,并且可能将对互斥体的引用作为参数传递)
关于c++ - 互斥保护宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46197902/