2010-08-18 10 views
5

माइक्रोसॉफ्ट विजुअल सी ++ कंपाइलर्स में EnterCriticalSection और ExitCriticalSection ऑब्जेक्ट्स थ्रेड के बीच सिंक्रनाइज़ेशन की अनुमति देने के लिए हैं।लिनक्स के माइक्रोसॉफ्ट के महत्वपूर्ण वर्गों के बराबर जीसीसी क्या है?

जीसीसी समकक्ष क्या है?

मैं __scoped_lock

वास्तव में मैं __atomic लोगों की संख्या के साथ-साथ परमाणु __sync कई कार्य करने की का उल्लेख देखने के साथ-साथ __sync_synchronize के लिए चारों ओर संदर्भ देखें।

मैं वास्तव में अपने परमाणु वृद्धि के लिए __sync_fetch_and_add का उपयोग कर रहा हूं, क्या मुझे इसके बजाय __atomic_add_dispatch का उपयोग करना चाहिए?
क्या अंतर है?

मुझे किसके उपयोग का उपयोग करना चाहिए? क्या सी ++ में कुछ संरचनाएं हैं जिनका उपयोग मैं जीसीसी और विजुअल सी ++ 2010 के नवीनतम संस्करण दोनों में कर सकता हूं जो कि उपलब्ध हैं क्योंकि मैं कुछ क्रॉस प्लेटफ़ॉर्म कोड लिखने जा रहा हूं।

मुझे लगता है कि बूस्ट में कुछ फ़ंक्शन उपलब्ध हैं, लेकिन विभिन्न कारणों से मुझे विंडोज़ के तहत बढ़ावा देने की अनुमति नहीं है।

+0

मुझे लगता है आप किसी भी अन्य पुस्तकालय या तो तो उपयोग नहीं कर सकते? क्यूटी में एक अच्छा (क्रॉस-प्लेटफार्म) थ्रेडिंग एपीआई है। – Job

उत्तर

13

लिनक्स (और अन्य यूनिक्सन) पर आपको PThreads, या Posix Threads का उपयोग करने की आवश्यकता है। विंडोज़ पर क्रिटिकल सेक्शन के बराबर नहीं है; इसके बजाय एक म्यूटेक्स का उपयोग करें।

संपादित करें: नीचे पहली टिप्पणी देखें - स्पष्ट रूप से पॉज़िक्स म्यूटेक्स Win32 क्रिटिकल सेक्शन के समान हैं, जिसमें वे एक ही प्रक्रिया से बंधे हैं।

+3

दरअसल, POSIX म्यूटेक्स Win32 गंभीर अनुभागों (प्रक्रिया-बाध्य) के बराबर हैं; Win32 Mutexes क्रॉस-प्रोसेस होने में महत्वपूर्ण अनुभागों से अलग है। – MSalters

+0

@MSalters: आह - उसे नहीं पता था। शब्दावली पुन: उपयोग करना चाहिए। –

+0

@MSalters, इसके अलावा, Win32 गंभीर अनुभाग Win32 mutexes की तुलना में बहुत तेज़ हैं क्योंकि उन्हें उपयोगकर्ता स्थान में लागू किया गया है और सिस्टम कॉल से जुड़े ओवरहेड को शामिल नहीं किया गया है। मैं Posix mutexes के बारे में नहीं जानता हालांकि? – Tanuj

2

EnterCriticalSection और शेष एपीआई Win32 API हैं। जहां तक ​​क्रॉस-प्लेटफॉर्म सिंक्रनाइज़ेशन एपीआई है, मुझे नहीं लगता कि कोई भी है (क्योंकि आप उल्लेख करते हैं कि आप बूस्ट का उपयोग नहीं कर सकते हैं)। इसके अलावा, आपने क्रॉस-प्लेटफॉर्म का उल्लेख किया है, क्या इसका मतलब विभिन्न आर्किटेक्चर भी है (जीसीसी भाग के लिए)। मैंने एक बड़ा कार्यान्वयन देखा है जहां प्रदान किए गए एपीआई का एक सामान्य सेट था जिसे देशी एपीआई (जैसे एईक्स पर fetch_and_add) के लिए सशर्त रूप से संकलित किया गया था या Win32 APIs pthreads का उपयोग किया गया था। मैंने एक बार posix threads on win32 का उपयोग करने का प्रयास किया लेकिन मुद्दों का एक समूह में भाग गया (लेकिन यह एक बहुत पुराना संस्करण था)। अब वाईएमएमवी।

6

यहाँ की जांच: http://en.wikipedia.org/wiki/Critical_section

/* Sample C/C++, Unix/Linux */ 
#include <pthread.h> 

/* This is the critical section object (statically allocated). */ 
static pthread_mutex_t cs_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; 

void f() 
{ 
    /* Enter the critical section -- other threads are locked out */ 
    pthread_mutex_lock(&cs_mutex); 

    /* Do some thread-safe processing! */ 

    /*Leave the critical section -- other threads can now pthread_mutex_lock() */ 
    pthread_mutex_unlock(&cs_mutex); 
} 

int main() 
{ 
    f(); 

    return 0; 
} 
1

आप केवल Windows मंच के लिए कार्यक्रमों को विकसित कर रहे हैं, मुझे लगता है कि सबसे अच्छा तरीका है Win32 एपीआई का उपयोग कर रहा है। अन्यथा आप क्यूटी सी ++ पुस्तकालयों का उपयोग कर सकते हैं (उस उद्देश्य के लिए क्यूटी कोर पर्याप्त है)।

यह भी देखें: QMutex और QMutexLocker तुम भी उपयोग कर सकते हैं: QReadWriteLock

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