2013-09-06 15 views
5

condition_variable पर नकली wakeups निम्नलिखित कोड डालें:जी ++ और बजना साथ ++

#include <iostream> 
#include <thread> 
#include <mutex> 
#include <condition_variable> 
#include <chrono> 

using namespace std; 

int main() { 
    mutex m; 
    condition_variable c; 

    bool fired = false; 
    int i = 0; 

    // This thread counts the times the condition_variable woke up. 
    // If no spurious wakeups occur it should be close to 5. 
    thread t([&]() { 
    unique_lock<mutex> l(m); 
    while (!fired) { 
     c.wait_for(l, chrono::milliseconds(100)); 
     ++i; 
    } 
    }); 

    // Here we wait for 500ms, then signal the other thread to stop 
    this_thread::sleep_for(chrono::milliseconds(500)); 
    { 
    unique_lock<mutex> l(m); 
    fired = true; 
    c.notify_all(); 
    cout << i << endl; 
    } 
    t.join(); 
} 

अब, जब मैं निर्माण इस का उपयोग करते हुए clang++ -std=c++11 -pthread foo.cpp सब कुछ ठीक है, यह मेरे मशीन पर 4 आउटपुट। जब मैं इसे g++ -std=c++11 -pthread foo.cpp के साथ बनाता हूं, तो मुझे कुछ प्रत्येक समय मिलता है, उदाहरण के लिए, 81513। मुझे एहसास है कि नकली जागरूकता की संख्या अनिर्धारित है, लेकिन मैं इसे इतना उच्च देखकर आश्चर्यचकित हुआ।

अतिरिक्त जानकारी: जब मैं wait_for को wait दोनों क्लैंग और जी ++ आउटपुट 0 द्वारा प्रतिस्थापित करता हूं।

क्या यह g ++ में एक बग/सुविधा है? यह झुकाव से भी अलग क्यों है? क्या मैं इसे और अधिक उचित व्यवहार करने के लिए प्राप्त कर सकता हूं?

इसके अलावा: gcc version 4.7.3 (Debian 4.7.3-4)

+0

यह जानने के लिए एक अच्छी बात यह होगी कि आप किस मानक पुस्तकालय को क्लैंग मामले में उपयोग करते हैं। यह मेरे सिस्टम बीटीडब्ल्यू पर जीसीसी 4.8.1 के साथ ठीक है। (4.7.3 के साथ संकलित नहीं होगा)। सभी धागे को स्ट्रैस करने से भविष्य में उपयोगी जानकारी हो सकती है। – PlasmaHH

+0

जीसीसी (उबंटू/लिनारो 4.7.2-2ubuntu1) 4.7.2 देता है: 4 –

+0

क्लैंग जी ++ के समान मानक लाइब्रेरी का उपयोग करता है, मेरे पास उस सिस्टम पर libC++ नहीं है। यह एक डेबियन परीक्षण बीटीडब्ल्यू है। –

उत्तर

1

मैं g ++ - 4.8 चल रहा था, और समस्या समाप्त हो गई। बहुत अजीब, g ++ - 4.7.3 में एक बग की तरह लगता है, हालांकि मैं इसे किसी अन्य मशीन पर पुन: उत्पन्न करने में सक्षम नहीं था।

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