2016-01-01 8 views
5

मैंने लॉकिंग के प्रयास विफल होने के मामले में एक म्यूटेक्स को लॉक करने के लिए निम्न मैक्रोज़ बनाए हैं और उस फ़ंक्शन से (जिस फ़ंक्शन के भीतर इस मैक्रो को बुलाया जाता है)। वर्तमान में मैंने इसे 2 मैक्रोज़ तक सीमित कर दिया है - एक ऐसे कार्यों से लौटने के लिए जो एक मूल्य लौटाते हैं, चाहे किसी भी प्रकार का काम न करें, और किसी अन्य कार्य को वापस करने के लिए जो कुछ भी वापस नहीं लौटाता है (यानी शून्य)।क्या कोई भी मैक्रो फ़ंक्शन प्रदान करने का कोई तरीका नहीं है जिसमें विभिन्न प्रकार के मानों को वापस करने के लिए कुछ भी शामिल नहीं है?

कोड मैक्रो (नीचे) केवल व्याख्या के लिए है और बहुत कम वास्तविक उत्पादन कोड है कि मैक्रो में उपयोग किया जाएगा के साथ क्या करना है।

#define MUTEX_LOCK()\ 
    {\ 
     if (pthread_mutex_lock(&mutex) != 0)\ 
     {\ 
      printf("Failed to lock mutex.\n");\ 
      return;\ 
     }\ 
    } 
#define MUTEX_LOCK_RVAL(err_val)\ 
    {\ 
     if (pthread_mutex_lock(&mutex) != 0)\ 
     {\ 
      printf("Failed to lock mutex.\n");\ 
      return err_val;\ 
     }\ 
    } 

void vfunc() 
{ 
    printf("\nIn vfunc()\n"); 
    MUTEX_LOCK(); 
    printf("\nOut of vfunc()\n"); 
} 

UINT16 uint16func() 
{ 
    printf("\nIn uint16func()\n"); 
    MUTEX_LOCK_RVAL(0); 
    printf("\nOut of uint16func()\n"); 

    return 9; 
} 

CHAR* errstr = "Hoo boy!"; 
CHAR* strfunc() 
{ 
    printf("\nIn strfunc()\n"); 
    MUTEX_LOCK_RVAL(errstr); 
    printf("\nOut of strfunc()\n"); 

    return NULL; 
} 

वहाँ एक रास्ता कम करने के लिए है परे इन्हें एक मैक्रो में उपयोग किया जा सकता है जिसका उपयोग मूल्य को वापस करने के साथ-साथ शून्य पर किया जा सकता है।

+4

फ़ंक्शन-जैसे मैक्रोज़ जिनमें वापसी होती है ... यह वास्तव में वास्तव में बुरा है। इसके बारे में भूल जाओ, बस 'if (! My_lock()) पर वापस लौटें;' कॉल लॉक पर उचित लॉक फ़ंक्शन के साथ। – Mat

+1

उदाहरण के लिए यह संभव हो सकता है [वैराडिक मैक्रोज़] (https://en.wikipedia.org/wiki/Variadic_macro), लेकिन चेतावनी हैं। और यह वास्तव में आपके कोड के अन्य पाठकों के लिए भ्रमित होगा (और "अन्य" के साथ मैं आपको एक वर्ष या उससे भी अधिक समय में शामिल करता हूं)। –

+0

@ जोचिमपिलबोर्ग क्या आप कॉल को भ्रमित करने की उम्मीद करते हैं, या केवल मैक्रो परिभाषा? अगर केवल उत्तरार्द्ध, कुछ न्यायिक टिप्पणियों को हल करना चाहिए, नहीं? –

उत्तर

4

यह संगत एएनएसआई मैं वापसी और एक अन्य सरल प्रतीक के साथ मैक्रो निर्धारित करें कि शून्य के लिए मूल्यांकन करता है और स्पष्ट रूप से दिखा रहा है कि यह शून्य है। यानी .:

#define VOID_RET //This nulls the return value 
#define MUTEX_LOCK(err_val)\ 
    {\ 
     if (pthread_mutex_lock(&mutex) != 0)\ 
     {\ 
      printf("Failed to lock mutex.\n");\ 
      return err_val;\ 
     }\ 
    } 
void *mutex = NULL; 
void vfunc(void) 
{ 
    printf("\nIn vfunc()\n"); 
    MUTEX_LOCK(VOID_RET); 
    printf("\nOut of vfunc()\n"); 
} 
UINT16 uint16func(void) 
{ 
    printf("\nIn uint16func()\n"); 
    MUTEX_LOCK(0); 
    printf("\nOut of uint16func()\n"); 

    return 9; 
} 
CHAR* errstr = "Hoo boy!"; 
CHAR* strfunc(void) 
{ 
    printf("\nIn strfunc()\n"); 
    MUTEX_LOCK(errstr); 
    printf("\nOut of strfunc()\n"); 

    return NULL; 
} 

मैं C11 और C99 के तहत इस कोड का परीक्षण किया।

+0

यह सख्त सी 9 0 के तहत भी काम करता है (कम से कम जीसीसी के साथ)। –

+0

वैसे भी, यह मेरे समाधान से काफी अच्छा है। – Rabbid76

2

जहां तक ​​मैं प्रलेखन से कह सकता हूं, आप मैक्रो फ़ंक्शन को कोई तर्क नहीं ले सकते हैं क्योंकि आप तर्कों की अपेक्षा रखने वाले मैक्रो फ़ंक्शन पर तर्क देने के लिए बाध्य नहीं हैं।
GNU GCC documentation से:

आप मैक्रो तर्क खाली छोड़ सकते हैं; इस पूर्वप्रक्रमक के लिए कोई त्रुटि नहीं है [...]


कई तर्क के लिए, यह दिलचस्प है:

आप बाहर तर्क पूरी तरह से नहीं छोड़ सकते; यदि एक मैक्रो दो तर्क लेता है, तो तर्क सूची के शीर्ष स्तर पर बिल्कुल एक कॉमा होना चाहिए।

इन दिये गये उदाहरण के साथ:

min(, b)  ==> (( ) < (b) ? ( ) : (b)) 
min(a,)  ==> ((a ) < () ? (a ) : ()) 
min(,)   ==> (( ) < () ? ( ) : ()) 
min((,),)  ==> (((,)) < () ? ((,)) : ()) 
+1

मैंने यह कोशिश की थी, लेकिन यह मान्य ansi सी नहीं है (मैं ** - पैडेंटिक और -फायर ** झंडे के साथ संकलित)। मुझे त्रुटि मिलती है * खाली मैक्रो तर्क आईएसओ सी 9 0 और आईएसओ सी ++ 98 * में अपरिभाषित हैं। –

+0

@ work.bin क्या आप मुझे बता सकते हैं कि आप इन पुराने मानकों से क्यों बंधे हैं? कम से कम सी 99 आजकल डिफ़ॉल्ट होना चाहिए, आईएमओ। – Downvoter

+0

आप चाहें! लेकिन सी 99 का समर्थन करने वाले बहुत सारे कंपाइलर नहीं हैं। यदि पोर्टेबिलिटी चिंता का विषय है तो आप सी 0 9 तक ही सीमित हैं। –

2

एकमात्र समाधान मैं कल्पना कर सकते हैं यह है:

#define MUTEX_LOCK(err_val)\ 
{\ 
    {\ 
     if (pthread_mutex_lock(&mutex) != 0)\ 
     {\ 
      printf("Failed to lock mutex.\n");\ 
      return err_val;\ 
     }\ 
    }\ 
} 

int test_int() 
{ 
    MUTEX_LOCK(1); 

    return 0; 
} 

void test_void() 
{ 
    MUTEX_LOCK(;); 

    return; 
} 
+0

विशेष रूप से सुरुचिपूर्ण नहीं, लेकिन चालाक। यह मेरे प्रश्न का उत्तर देता है लेकिन मुझे यकीन नहीं है कि मैं इसका उपयोग करूंगा। –

+0

@ work.bin मैं पूरी तरह से आपसे सहमत हूं, यह बदसूरत है। – Rabbid76

संबंधित मुद्दे

 संबंधित मुद्दे