c++ - 互斥保护宏

标签 c++ macros mutex

这是我在这个社区上的第一篇文章,所以请多多包涵。

有没有办法在宏本身中互斥保护宏。

例如,

#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/

相关文章:

c++ - 有没有办法用 ON_CALL 制作模拟函数 "interesting"?

unit-testing - 如何在使用 throw-with-msg 的测试中捕获 IllegalArgumentException?

go - 如何在无错误的情况下按键编写互斥锁?

c - 为什么 pthreads 的条件变量函数需要互斥量?

c++ - 错误 1 ​​错误 C2678 : binary '!=' : no operator found which takes a left-hand operand of type 'std::ofstream' (or there is no acceptable conversion)

c++ - 尽管在 zlib.lib 中链接,但 Unresolved external 问题

c++ - libwebsocket : unable to write frame bigger than 7160 bytes

macros - 如何强制类型在编译时实现特征?

c - 在 C 中使用宏对 3 个值进行排序

c++ - 从不同的线程访问外部变量是否必须使用互斥锁?