2016-05-10 6 views
0

Ich konnte nicht die Zerstörung eines boost::lockfree::spsc_queue Elements auf Pop erzwingen. (Sie werden korrekt zerstört, wenn ein Push ein Element des Ringpuffers überschreibt oder wenn die Liste zerstört wird, selbst wenn auf das Element durch Referenz zugegriffen wird).boost :: lockfree - Aufruf Destruktor für in Warteschlange befindliche Element

Weder ich war in der Lage, den Zugriff auf das Element in der Warteschlange zu speichern, um es über eine Referenz zu zerstören.

#include <boost/lockfree/spsc_queue.hpp> 
#include <boost/lockfree/policies.hpp> 
#include <iostream> 
#include <memory> 

using namespace boost::lockfree; 

class testDestructor{ 
     public: 
     int x; 
     static int y; 
     testDestructor(): x(y++){} 
     ~testDestructor(){ std::cout << x << std::endl ;} 
     }; 

int testDestructor::y=1; 


spsc_queue< std::shared_ptr<testDestructor>, capacity<100>> q; 
int sum = 0; 

void produce() 
{ 
    for (int i = 1; i <= 100; ++i) 
    q.push(std::move(std::shared_ptr<testDestructor>(new testDestructor()))) ; 
} 


void consume(std::shared_ptr<testDestructor> & tp){ 
    sum+=tp->x; 
//TRYING TO FORCE DESTRUCTION: 
    tp.reset(); 
} 

int main() 
{ 
    produce(); 
    //consuming a reference to force freeing the pointer 
    q.consume_all([]( std::shared_ptr<testDestructor> & tp){ consume(tp); }); 
    std::cout << sum << "<- Destructors should be called before this" << std::endl; 
} 
+0

, welche Version von boost? Scheint zu arbeiten: [live] (http://coliru.stacked-crooked.com/a/b0b66b42ac190035) oder ist das nicht das erwartete Ergebnis? – Thomas

+0

@Thomas Version 1.54 – xvan

+0

Versuchen Sie zu aktualisieren, das alte Zeug hatte Bugs. – Thomas

Antwort

1

Es gibt einige Probleme mit spsc_queue in älteren Boost-Versionen. Der Code, den du gepostet hast, funktioniert gut mit Boost 1.60. Aktualisieren Sie auf die aktuelle Version, wenn Sie können.

Live on Coliru