2017-09-13 63 views
0

这是我在这个社区的第一篇文章,所以请耐心等待。互斥量保护宏

有没有一种方法可以在宏本身中互斥保护宏。

例如,

#define FUNCTION_ \ 
doSomething() 

基本上,我希望通过自己做这样的事情

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

如需进一步信息,宏都在头文件中声明,(无名称空间或类),它处理对API的调用。我们正在使用C++。这个头文件被多个项目利用,因此宏观本身的改革是不可能的。有关宏的更多详细信息,它会调用log4CXX.log4CXX是线程安全的;然而,使用这个宏的两个线程同时进行写入调用并不是线程安全的。对于这个问题,Helgrind抱怨Valgrind。在代码中保护宏的互斥锁修复了这个问题,但是不是每个单独的调用都保护互斥锁,而是让宏保护自己的调用。

+5

您使用的是C还是C++?如果你使用的是C++,我会建议除了宏之外的东西,并使用锁守。 – NathanOliver

+1

你的问题到底是什么?你可以自己试试看,如果有效的话。只需添加缺少的括号,就完成了。 –

+0

我们使用C++。该项目使用宏来封装log4CXX的API调用。 log4CXX是线程安全的;然而,使用这个宏的两个线程同时进行写入调用并不是线程安全的。对于这个问题,Helgrind抱怨Valgrind。在代码中保护宏的互斥锁修复了这个问题,但是不是每个单独的调用都保护互斥锁,而是让宏保护自己的调用。 – HunterLee

回答

0

你有密码。把它掩盖起来。 这应该做到:

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

感谢您的回答。当谈到互斥体的时候,我还有一个问题。这个文件是头没有命名空间或类。在编译多个定义时,声明互斥体会导致投诉。请记住,这个互斥体是pthread_mutex_t的包装。 – HunterLee

+0

@HunterLee这应该是一个新问题。 –

1

如果您已经在这

#define FUNCTION_ \ 
doSomething() 

,如果真的是有没有机会阻止这种宏观疯狂,那么至少不要把它一步。如果您需要在doSomething()锁那么最简单的将是获得锁的功能:

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

,或者如果由于某种原因,你不能改变的功能,然后把它包

#define FUNCTION_ \ 
doSoemthingLocked() 

void doSomethingLocked() { 
    mutex.lock(); 
    doSomething(); 
    mutex.unlock(); 
} 

(也许声明内联,如果你需要把它放在一个标题,也许传递一个参考互斥体参数)

0

对于问题的解决方案如下:

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

但是,对于互斥本身我有包装所以在这种情况下,我宣布互斥的pthread_mutex_t互斥:

的extern互斥互斥;

然后在.cpp文件:

#include <headerFile.hpp> 

Mutex mutex; 

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