这是我在这个社区的第一篇帖子,所以请耐心等待。
有没有办法在宏本身中互斥保护宏。
例如,
#define FUNCTION_ \
doSomething()
基本上,我希望做这样的事情
#define FUNCTION_ \
mutex.lock \
doSomething() \
mutex.unlock
有关更多信息,宏都在头文件中声明,它们自己(没有命名空间或类),它处理对API的调用。我们正在使用C ++。这个头文件被多个项目使用,因此对宏本身进行大修是不可能的。有关宏的更多细节,它包含对log4CXX.log4CXX的调用是线程安全的;但是,使用这个宏的两个线程同时进行写调用并不是线程安全的。在运行Valgrind时,Helgrind抱怨道。在代码中保护宏的互斥锁修复了问题,但是每次调用都没有互斥保护,而是让宏保护自己的呼叫。
答案 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;
这将创建互斥锁的单个实例,并防止发现多个同名实例的问题。