互斥锁保护宏

时间:2017-09-13 12:42:12

标签: c++ macros mutex

这是我在这个社区的第一篇帖子,所以请耐心等待。

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

例如,

#define FUNCTION_ \
doSomething()

基本上,我希望做这样的事情

#define FUNCTION_ \
mutex.lock \
doSomething() \
mutex.unlock

有关更多信息,宏都在头文件中声明,它们自己(没有命名空间或类),它处理对API的调用。我们正在使用C ++。这个头文件被多个项目使用,因此对宏本身进行大修是不可能的。有关宏的更多细节,它包含对log4CXX.log4CXX的调用是线程安全的;但是,使用这个宏的两个线程同时进行写调用并不是线程安全的。在运行Valgrind时,Helgrind抱怨道。在代码中保护宏的互斥锁修复了问题,但是每次调用都没有互斥保护,而是让宏保护自己的呼叫。

3 个答案:

答案 0 :(得分:1)

如果你已经有了这个

<html >
<head>
    <?php echo $map['js'];?>
    </head>
<body>
<?php echo $map['html'];?>
</body>
</html>

如果真的没有机会阻止这种宏观的疯狂,那么至少不要再进一步了。如果您需要#define FUNCTION_ \ doSomething() 中的锁,那么最简单的方法是获取函数中的锁:

doSomething()

或者如果由于某种原因您无法更改该功能,请将其换行

void doSomething() {
    mutex.lock();
    /* .... */ 
    mutex.unlock();
}

(如果需要将其放在标题中,可能会将其声明为内联,并且可能会将对互斥量的引用作为参数传递)

答案 1 :(得分:0)

你有代码。只是掩盖它。 这应该做:

#define FUNCTION_ \
do { \
    mutex.lock() \
    doSomething() \
    mutex.unlock() \
} while(0)

答案 2 :(得分:0)

问题的解决方案如下:

#define FUNCTION_ \
{ \
   mutex.lock(); \
   doSomething(); \
   mutex.unlock(); \
} \

但是,对于互斥锁本身,我有一个包含pthread_mutex_t的互斥锁,因此在这种情况下我将互斥锁声明为:

extern Mutex互斥;

然后在.cpp文件中:

#include <headerFile.hpp>

Mutex mutex;

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