2010-08-20 16 views
6

मैंने म्यूटेक्स के बारे में कुछ दस्तावेज पढ़े हैं और अभी भी मुझे एकमात्र विचार मिला है कि यह धागे को संसाधनों तक पहुंचने से रोकने में मदद करता है जो पहले से ही किसी अन्य संसाधन द्वारा उपयोग किया जा रहा है।क्या कोई म्यूटेक्स को समझा सकता है और इसका उपयोग कैसे किया जाता है?

मैं कोड स्निपेट से मिल गया और मार डाला जो ठीक काम करता है:

#include <windows.h> 
#include <process.h> 
#include <iostream> 
using namespace std; 


BOOL FunctionToWriteToDatabase(HANDLE hMutex) 
{ 
    DWORD dwWaitResult; 
    // Request ownership of mutex. 
    dwWaitResult = WaitForSingleObject(
    hMutex, // handle to mutex 
    5000L); // five-second time-out interval 
     switch (dwWaitResult) 
     { 
     // The thread got mutex ownership. 
      case WAIT_OBJECT_0: 
      __try 
      { 
       // Write to the database. 
      } 
      __finally { 
      // Release ownership of the mutex object. 
      if (! ReleaseMutex(hMutex)) { 
      // Deal with error. 
     } 
      break; 
     } 
      // Cannot get mutex ownership due to time-out. 
      case WAIT_TIMEOUT: 
      return FALSE; 
      // Got ownership of the abandoned mutex object. 
      case WAIT_ABANDONED: 
      return FALSE; 
     } 
    return TRUE; 
} 

void main() 
{ 
    HANDLE hMutex; 

    hMutex=CreateMutex(NULL,FALSE,"MutexExample"); 

    if (hMutex == NULL) 
    { 
     printf("CreateMutex error: %d\n", GetLastError()); 
    } 
    else if (GetLastError() == ERROR_ALREADY_EXISTS) 
     printf("CreateMutex opened existing mutex\n"); 

    else 
     printf("CreateMutex created new mutex\n"); 

} 

लेकिन क्या मुझे समझ नहीं आता जहां धागा है और जहां साझा संसाधन है? क्या कोई भी बेहतर लेख या दस्तावेज समझा सकता है या प्रदान कर सकता है?

+1

आपका कोड स्निपेट अधूरा लगता है, उदा। मैं नहीं देख सकता कि FunctionToWriteToDatabase कहां कहा जाता है। क्या आप अधिक प्रदान कर सकते हैं और आप इसे कहां से प्राप्त कर चुके हैं?यह उपयोगी भी होगा यदि आपने स्पष्ट किया कि आपका प्रश्न सामान्य रूप से म्यूटेक्स या इस विशेष कोड स्निपेट के बारे में है या नहीं। – danio

उत्तर

11

एक म्यूटेक्स म्यूट ual पूर्व संसाधन के लिए छद्म पहुंच प्रदान करता है; आपके मामले में, एक डेटाबेस। आपके प्रोग्राम में कई धागे नहीं हैं, लेकिन आपके प्रोग्राम के कई उदाहरण चल सकते हैं, जो आपके म्यूटेक्स के खिलाफ सुरक्षा कर रहा है। प्रभावी रूप से, यह अभी भी एक से अधिक धागे से पहुंच के खिलाफ सुरक्षा कर रहा है, यह सिर्फ इतना है कि वे धागे अलग प्रक्रियाओं में हो सकते हैं।

आपका कोड नाम म्यूटेक्स बना रहा है जिसे आपके एप्लिकेशन के कई उदाहरणों में साझा किया जा सकता है। यह इंटरप्रोसेस संचार का एक रूप है।

दो या दो से अधिक प्रक्रियाओं में एक ही नाम दिया म्युटेक्स बनाने के लिए CreateMutex कॉल कर सकते हैं: CreateMutex पर MSDN प्रलेखीकरण नामित mutexes के बारे में अतिरिक्त उपयोगी जानकारी है। पहली प्रक्रिया वास्तव में म्युटेक्स बनाता है, और पर्याप्त पहुँच के साथ बाद में प्रक्रियाओं अधिकार बस मौजूदा म्युटेक्स करने के लिए एक संभाल खोलने ...

एकाधिक प्रक्रियाओं ही म्युटेक्स वस्तु के हैंडल कर सकते हैं, के उपयोग को सक्षम करने इंटरप्रोसेस सिंक्रनाइज़ेशन के लिए ऑब्जेक्ट।

एक म्यूटेक्स केवल तभी जरूरी है जब आप जिस डेटाबेस के खिलाफ काम कर रहे हैं वह स्वाभाविक रूप से बहुप्रचारित पहुंच का समर्थन नहीं करता है।

-1

आप इस उल्लेख अतः विभिन्न धागा तुल्यकालन तंत्र Difference between Locks, Mutex and Critical Sections

की तुलना के लिए पोस्ट कर सकते हैं आप में विशेष जानकारी Mutex चाहते हैं तो विकिपीडिया होगा आपको पर्याप्त विवरण दें।

0

msdn में यह link मुख्य() फ़ंक्शन में बने धागे के साथ आपका एक समान उदाहरण प्रदान करता है। लेकिन फिर साझा संसाधन, जिसे डेटाबेस माना जाता है, शामिल नहीं है।
वैसे भी, एक साझा संसाधन है कि जो कुछ एक से अधिक थ्रेड से पहुँचा जा करने की जरूरत है: settingsfiles, ड्राइवरों, डेटाबेस, ...

मन आपको लगता है कि उदाहरण में काउंटर म्युटेक्स द्वारा संरक्षित, जबकि यह है, जबकि लिखा है, संरक्षित नहीं होने के दौरान पढ़ा गया है। इस मामले में, शायद कोई समस्या नहीं है, यह थोड़ा सा मैला है।

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