[英]Mutex Protect Macro
这是我在该社区的第一篇文章之一,请耐心等待。
有没有一种方法可以在宏本身中互斥保护宏。
例如,
#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();
}
(如果需要将其放在标题中,则可以声明为内联,并且可以将对互斥量的引用作为参数传递)
你有代码。 掩盖。 应该这样做:
#define FUNCTION_ \
do { \
mutex.lock() \
doSomething() \
mutex.unlock() \
} while(0)
该问题的解决方案如下:
#define FUNCTION_ \
{ \
mutex.lock(); \
doSomething(); \
mutex.unlock(); \
} \
但是,对于互斥锁本身,我有一个包裹pthread_mutex_t的互斥锁,因此在这种情况下,我将互斥锁声明为:
互斥互斥体互斥;
然后在.cpp文件中:
#include <headerFile.hpp>
Mutex mutex;
这将创建一个互斥锁实例,并防止发现多个同名实例的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.