簡體   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