繁体   English   中英

互斥保护宏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM