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