मैंने लॉकिंग के प्रयास विफल होने के मामले में एक म्यूटेक्स को लॉक करने के लिए निम्न मैक्रोज़ बनाए हैं और उस फ़ंक्शन से (जिस फ़ंक्शन के भीतर इस मैक्रो को बुलाया जाता है)। वर्तमान में मैंने इसे 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;
}
वहाँ एक रास्ता कम करने के लिए है परे इन्हें एक मैक्रो में उपयोग किया जा सकता है जिसका उपयोग मूल्य को वापस करने के साथ-साथ शून्य पर किया जा सकता है।
फ़ंक्शन-जैसे मैक्रोज़ जिनमें वापसी होती है ... यह वास्तव में वास्तव में बुरा है। इसके बारे में भूल जाओ, बस 'if (! My_lock()) पर वापस लौटें;' कॉल लॉक पर उचित लॉक फ़ंक्शन के साथ। –
Mat
उदाहरण के लिए यह संभव हो सकता है [वैराडिक मैक्रोज़] (https://en.wikipedia.org/wiki/Variadic_macro), लेकिन चेतावनी हैं। और यह वास्तव में आपके कोड के अन्य पाठकों के लिए भ्रमित होगा (और "अन्य" के साथ मैं आपको एक वर्ष या उससे भी अधिक समय में शामिल करता हूं)। –
@ जोचिमपिलबोर्ग क्या आप कॉल को भ्रमित करने की उम्मीद करते हैं, या केवल मैक्रो परिभाषा? अगर केवल उत्तरार्द्ध, कुछ न्यायिक टिप्पणियों को हल करना चाहिए, नहीं? –