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;
}
, welche Version von boost? Scheint zu arbeiten: [live] (http://coliru.stacked-crooked.com/a/b0b66b42ac190035) oder ist das nicht das erwartete Ergebnis? – Thomas
@Thomas Version 1.54 – xvan
Versuchen Sie zu aktualisieren, das alte Zeug hatte Bugs. – Thomas