2017-03-10 39 views
13

我已經試過了的boost ::纖維::屏障,我無法找出原因如下代碼死鎖:爲什麼我升壓纖維代碼死鎖

#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 

我抄我的一個自定義的測試調度算法到測試代碼,我看到的,過了一段時間,沒有光纖可用於運行,本地ID 1光纖根本就沒有繼續。

升壓版本1.63與Visual Studio 2015年預編譯包和彙編是在64位

回答

1

我試着用boost-1.63.0在Debian/unstable上編譯程序,我可以確認問題。當我運行該程序使用valgrind訪問未初始化的內存被報告,並在以後也無效的讀取,所以我想問題是與該特定的增強版本。

+0

謝謝,我沒有嘗試valgrind這個例子,謝謝你的確認。 – newhouse

-1

變化

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

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

或等到升壓1.64釋放

+1

這不是一個解決方案,在這種情況下,你只是將屏障擴大到更大的數量,它不會阻止成對的光纖,但沒有。你寫道,我應該等待boost-1.64,你知道這個偶然的錯誤嗎? – newhouse

+0

我與@newhouse。除非你知道增加屏障數量的合乎邏輯的理由,否則這至少是一個貨運諮詢的答案。如果沒有任何論證,他們會接受像這樣的「神奇建議」,我會給我的團隊中的程序員一個非常嚴厲的談話。 – sehe

2

代碼從來沒有死鎖,但有一些變數c旁觀者:我在Mac上,我正在使用boost 1.64,而且我可能會以不同的方式編譯boost。

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 

僅供參考 - 我編譯和運行這樣的:

./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 

這可能不是你所需要的,但因爲我的作品,我不能幫你。