2017-03-10 6 views
13

deadlocking है मैं बाहर की कोशिश की है बढ़ावा :: फाइबर :: बाधा और मैं बाहर नहीं मिल सकता है क्यों निम्नलिखित कोड गतिरोध:क्यों मेरी बढ़ावा फाइबर कोड

#include <boost/fiber/all.hpp> 
#include <iostream> 
#include <boost/range/algorithm/generate.hpp> 
#include <boost/range/algorithm/for_each.hpp> 

void barrier_test() 
{ 
    boost::fibers::barrier barrier(2); 
    std::vector<boost::fibers::fiber> myfibers(4); 
    boost::generate(myfibers, [&barrier]() { 
     return boost::fibers::fiber([](boost::fibers::barrier& barrier) { 
      static unsigned id_inc = 0; 
      const auto id = ++id_inc; 
      std::cout << "fiber id: " << boost::this_fiber::get_id() << " - local id: " << id << std::endl; 
      barrier.wait(); 
      std::cout << "barrier passed, fiber id: " << boost::this_fiber::get_id() << " - local id: " << id << std::endl; 
     }, std::ref(barrier)); 
    }); 

    std::cout << "main fiber: " << boost::this_fiber::get_id() << std::endl; 
    boost::for_each(myfibers, [](boost::fibers::fiber& aFiber) { 
      aFiber.join(); 
    }); 
    std::cout << "end of program" << std::endl; 
} 

अगर मैं के रूप में "प्रेषण" लांच सेट यह के माध्यम से जा सकते हैं तो इसमें दौड़ने के आदेश के साथ कुछ है, लेकिन मुझे नहीं पता कि क्या गलत है। इसलिए मैंने कल्पना करने की कोशिश की है कि दृश्य के पीछे लॉकिंग कैसे चलती है, क्या चल रहा है, आदि, लेकिन मुझे पता नहीं चल रहा है, मूल कोड क्यों खत्म नहीं हो पा रहा है।

किसी इसे आज़माने के लिए नहीं चाहता है, मुझे यहाँ उत्पादन मैं देख रहा हूँ डाल करते हैं:

main fiber: 000000000042C960 
fiber id: 000000000042C6E0 - local id: 1 
fiber id: 000000000044CF60 - local id: 2 
barrier passed, fiber id: 000000000044CF60 - local id: 2 
fiber id: 000000000045D020 - local id: 3 
fiber id: 000000000046D0E0 - local id: 4 
barrier passed, fiber id: 000000000046D0E0 - local id: 4 
barrier passed, fiber id: 000000000045D020 - local id: 3 

मैं परीक्षण कोड में मेरा एक कस्टम परीक्षण अनुसूचक एल्गोरिथ्म कॉपी किया है और मैं देख रहा हूँ, कि थोड़ी देर के बाद, दौड़ने के लिए कोई फाइबर उपलब्ध नहीं है, स्थानीय आईडी 1 फाइबर बस जारी नहीं है।

बूस्ट संस्करण दृश्य स्टूडियो 2015 precompiled पैकेज के साथ 1.63 और संकलन

उत्तर

1

मैंने बूब-1.63.0 के साथ डेबियन/अस्थिर पर कार्यक्रम की कोशिश की और मैं समस्या की पुष्टि कर सकता हूं। जब मैं valgrind का उपयोग कर प्रोग्राम चलाता हूं तो अनियमित स्मृति तक पहुंच की सूचना दी जाती है और बाद में अमान्य पढ़ता है, इसलिए मुझे लगता है कि समस्या उस विशिष्ट बूस्ट संस्करण के साथ है।

+0

धन्यवाद, मैंने इस उदाहरण पर valgrind कोशिश नहीं की, इस पुष्टि के लिए धन्यवाद। – newhouse

-1

परिवर्तन

boost::fibers::barrier barrier(2); 

boost::fibers::barrier barrier(4); 

लिए 64 बिट में है या बढ़ावा-1.64 तक इंतजार

जारी किया गया है
+1

यह कोई समाधान नहीं है, इस मामले में आप केवल एक बड़ी संख्या में बाधा बढ़ाते हैं और यह जोड़े में फाइबर नहीं रखेगा, लेकिन कोई भी नहीं। आपने लिखा है कि मुझे बूस्ट-1.64 के लिए इंतजार करना चाहिए, क्या आप इस मौके पर एक बग के बारे में जानते हैं? – newhouse

+0

मैं @ न्यूहाउस के साथ हूं। जब तक आप बाधा गिनती को बढ़ाने के लिए एक तार्किक कारण नहीं जानते हैं, यह सबसे अच्छा मालवाहक उत्तर देने वाला उत्तर है। मैं अपनी टीम पर किसी भी प्रोग्रामर को बहुत कठोर बात कर रहा हूं कि अगर वे बिना किसी तर्क के "जादुई सलाह" स्वीकार करते हैं। – sehe

2

कोड मेरे लिए कभी भी deadlocks नहीं है, लेकिन सी के लिए कुछ चर हैं ऑनसाइडर: मै मैक पर हूं, मैं 1.64 बूस्ट का उपयोग कर रहा हूं, और मैंने अलग-अलग संकलन को संकलित किया होगा।

boost? ./fibers 
main fiber: 0x7f877cc02bc0 
fiber id: 0x100cbce00 - local id: 1 
fiber id: 0x100ebce00 - local id: 2 
barrier passed, fiber id: 0x100ebce00 - local id: 2 
fiber id: 0x100fbce00 - local id: 3 
fiber id: 0x1010bce00 - local id: 4 
barrier passed, fiber id: 0x1010bce00 - local id: 4 
barrier passed, fiber id: 0x100cbce00 - local id: 1 
barrier passed, fiber id: 0x100fbce00 - local id: 3 
end of program 

FYI करें - मैं संकलित और इस तरह भाग गया:

./bootstrap.sh --prefix=/Users/john/boost/boost_installation --without-libraries=python 

./b2 install cxxflags='-std=c++14' -j 6 threading=multi variant=release link=shared stage --reconfigure 

g++ -std=c++14 -I/Users/john/boost/boost_installation/include/ -L/Users/john/boost/boost_installation/lib -lboost_context -lboost_system -lboost_thread -lpthread -lboost_fiber -o fibers fibers.cpp 

DYLD_LIBRARY_PATH=/Users/john/boost/boost_installation/lib 

./fibers 

यह तुम क्या जरूरत है नहीं हो सकता है, लेकिन जब से यह मेरे लिए काम करता क्या मैं आपकी मदद नहीं कर सकता।

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