का उपयोग trylock:pthread_mutex_trylock का उपयोग कैसे करें?
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
और फिर मुख्य():
int main()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
यहाँ उत्पादन पहले पहले धागा और फिर बाकी के कुछ उसके बाद फिर से पहले प्रिंट, और। लॉक काम नहीं कर रहा है। यदि मैं इसे pthread_mutex_lock
के साथ प्रतिस्थापित करता हूं तो हर चीज बहुत अनुक्रमिक रूप से दिखाई देती है!
हास्यास्पद गलती क्या है?
जिज्ञासा से, क्या आप एक उदाहरण प्रदान कर सकते हैं जहां '..._ lock()' को '..._ trylock()' को प्राथमिकता दी जाती है? पूर्व। यदि आप एक टाइमआउट को कार्यान्वित करना चाहते हैं, तो 'trylock' पसंद नहीं होगा? या क्या यह एक टाइमआउट करने के लिए समझ में नहीं आता है? – theMayer
'..._ लॉक()' ज्यादातर मामलों में उपयुक्त विकल्प है क्योंकि ज्यादातर मामलों में, थ्रेड म्यूटेक्स लेने के बिना कोई उपयोगी आगे प्रगति नहीं कर सकता है। इस मामले में, यदि '' trylock() 'का उपयोग किया जाता है और लॉक नहीं ले सकता है, तो एकमात्र विकल्प चारों ओर लूप करना है और इसे फिर से लॉक करने का प्रयास करना है। टाइमआउट केवल उन मामलों में आवश्यक होना चाहिए जहां आगे की प्रगति के लिए बाहरी घटना की आवश्यकता होती है, जो एक शर्त चर के लिए मानचित्रण करता है और इसलिए 'pthread_cond_timedwait() 'का उपयोग किया जा सकता है। एक म्यूटेक्स पर एक असीमित प्रतीक्षा एक असाधारण स्थिति के बजाय कोड में एक समस्या को इंगित करता है। – caf
अंतिम वाक्य के साथ सहमत हैं ... मुझे कुछ विरासत कोड मिला है जहां डेवलपर को थोड़ा महत्वाकांक्षी मिला है और शायद यह समझ में नहीं आया कि थ्रेडिंग कैसे काम करती है। कोड एक समय में एक मिलीसेकंद के लिए धागे को सोने का प्रयास कर रहा है। आपको हंसना है, अन्यथा यह आपको रोता है! – theMayer