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 और संकलन
धन्यवाद, मैंने इस उदाहरण पर valgrind कोशिश नहीं की, इस पुष्टि के लिए धन्यवाद। – newhouse