2009-07-15 10 views
26

क्या पॉट्रेड के साथ एक पोर्टेबल थ्रेडिंग के समान परमाणु परिवर्तनीय संचालन के लिए सी में एक (POSIX-) पोर्टेबल तरीका है?यूनिक्स पोर्टेबल परमाणु संचालन

परमाणु संचालन "वृद्धि और प्राप्त" जैसे ऑपरेशन होते हैं जो परमाणु रूप से निष्पादित होते हैं जिसका मतलब है कि कोई संदर्भ स्विच ऑपरेशन में हस्तक्षेप नहीं कर सकता है। लिनक्स कर्नेल स्पेस में, हमें atomic_t प्रकार है, जावा में हमारे पास java.util.concurrent.atomic पैकेज है।

लिनक्स पर, atomic.h फ़ाइल परमाणु संचालन प्रदान करता है, लेकिन इसमें प्लेटफार्म निर्भर है। #include <asm-x86_64/atomic.h> और यह मैक ओएस एक्स पर भी इसी तरह उपलब्ध नहीं है।

+0

कुछ जीसीसी बनाया-इन कर रहे हैं, [यहाँ वर्णित] (http://gcc.gnu.org/onlinedocs/gcc-4.5.0/ जीसीसी/परमाणु-Builtins.html)। – caf

+0

अच्छा, जीसीसी तक सीमित है, लेकिन यह मेरे लिए ठीक होगा। – dmeister

+0

और यहां नए जीसीसी के लिए: http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html – osgx

उत्तर

0

AFAIK परमाणु संचालन करने के लिए कोई क्रॉस-प्लेटफ़ॉर्म तरीके नहीं हैं। वहाँ एक पुस्तकालय हो सकता है लेकिन मुझे नहीं पता। हालांकि, खुद को रोल करना विशेष रूप से कठिन नहीं है।

0

मुझे नहीं लगता कि वहां है।

इसे हल करने का एक तरीका, पाठ्यक्रम की अनुमति देने वाले लाइसेंस, प्रासंगिक प्रति-आर्किटेक्चर कार्यान्वयन को उदाहरण से कॉपी करना होगा। लिनक्स कर्नेल स्पेस। मैंने उन प्राइमेटिवों के बारीकी से विकास का पालन नहीं किया है, लेकिन मुझे लगता है कि वे वास्तव में प्राइमेटिव हैं, यानी कर्नेल में अन्य सेवाओं या एपीआई पर निर्भर नहीं हैं।

3

नहीं, POSIX कोई पोर्टेबल लॉक-फ्री/परमाणु संचालन निर्दिष्ट नहीं करता है। यही कारण है कि उनके पास pthreads है।

आपको या तो पोर्टेबिलिटी के लिए गैर-मानक तरीकों का उपयोग करना होगा या पीआरटीहेड के साथ चिपकना होगा।

9

जब से तुम ओएस एक्स के लिए पूछा:

(और के बाद से पार platformity इस सूत्र में उठाया गया था।)

ओएस एक्स कार्यों OSAtomicAdd32() और दोस्तों है। उन्हें "/usr/include/libkern/OSAtomic.h" में घोषित किया गया है। The Threading Programming guide देखें, अनुभाग "परमाणु संचालन का उपयोग"।

और विंडोज के लिए, इंटरलाक्डइनक्रिएशन() और दोस्तों (एमएसडीएन देखें) है।

साथ में जीसीसी builtins __sync_fetch_and_add साथ

() और दोस्तों (ऊपर से जोड़ा गया है), तो आप हर मुख्य डेस्कटॉप मंच के लिए कुछ होना चाहिए।

कृपया ध्यान दें कि मैंने अभी तक स्वयं का उपयोग नहीं किया है, लेकिन शायद अगले कुछ दिनों में ऐसा ही करेगा।

12

जो भी भविष्य में इस पर ठोकर खाता है, उसके लिए सी 11 परमाणु अब सबसे अच्छा तरीका है - मुझे विश्वास है कि उन्हें जीसीसी 4.9 में शामिल किया जाएगा।

+8

क्या आप इस पर विस्तार कर सकते हैं? – GraphicsMuncher

6

सी 11 के रूप में एक वैकल्पिक Atomic library है जो परमाणु संचालन प्रदान करता है। यह इस वैकल्पिक सुविधा के साथ सी 11 कंपाइलर (जैसे जीसीसी -4.9) वाले प्लेटफॉर्म पर पोर्टेबल है।

परमाणु की उपस्थिति और __STDC_NO_ATOMICS__ साथ की जाँच की जा सकती है, <stdatomic.h>

परमाणु की उपस्थिति।ग

#include <stdio.h> 
#include <stdlib.h> 
#ifndef __STDC_NO_ATOMICS__ 
#include <stdatomic.h> 
#endif 

int main(int argc, char**argv) { 
    _Atomic int a; 
    atomic_init(&a, 42); 
    atomic_store(&a, 5); 
    int b = atomic_load(&a); 
    printf("b = %i\n", b); 

    return EXIT_SUCCESS; 
} 

संकलक आमंत्रण

clang -std=c11 atomic.c 
gcc -std=c11 atomic.c 
संबंधित मुद्दे