2017-09-13 62 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; 

這將創建互斥體的單個實例,並防止問題與被發現同名的多個實例。