PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : boost::threads



f0rtex
04-10-2004, 10:21
Hi folks!

Folgendes Programm bereitet mir Kopfzerbrechen:



#include <boost/thread/thread.hpp>
#include <boost/thread/xtime.hpp>
#include <iostream>

using namespace std;

struct thread_alarm
{
thread_alarm(int secs) : m_secs(secs)
{
cout << "Konstruktor" << endl;
}
~thread_alarm()
{
cout << "Destruktor" << endl;
}
void operator()()
{
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += m_secs;

boost::thread::sleep(xt);

std::cout << "alarm sounded..." << std::endl;
}

int m_secs;
};

int main(int argc, char* argv[])
{
int secs = 5;
std::cout << "setting alarm for 5 seconds..." << std::endl;
thread_alarm alarm(secs);
boost::thread thrd(alarm);
thrd.join();
}


Und die Ausgabe dazu:


$ $ g++ -D_REENTRANT boost_org.cpp -lboost_thread
$ ./a.out
setting alarm for 5 seconds...
Konstruktor
Destruktor
Destruktor
Destruktor
Destruktor
alarm sounded...
Destruktor
Destruktor
$


Wieso wird bei diesem simplen Bsp. der Destruktor 6 Mal aufgerufen?
Und was geschieht mit den Membervariablen?

Danke im Voraus
MfG
f0rtex

locus vivendi
04-10-2004, 14:44
6 mal kommt mir auch etwas oft vor. 4 mal hätte ich nach einem kurzen Blick auf boost::thread erwartet. Es werden halt einfach jede Menge (zu viele) Kopien gemacht.

boost::thread ist auch nach Meinung vieler Leute nicht gut. Meiner Meinung nach ist es nicht flexibel genug. Die Design-Entscheidung, den Thread bereits aus dem Konstruktor heraus zu starten finde ich unglücklich. Außerdem lässt sich boost::thread nicht leicht für verschiedene Systeme anpassen, weil doch im gesamten Code viel auf den Präprozessor zurückgegriffen wird um Plattformunterschiede zu behandeln. Außerdem deckt es funktional nur sehr wenig von dem ab, was man mit anderen Threading - Bibliotheken machen kann.

Also kurz gesagt, solltest du vielleicht überdenken, ob du boost::thread wirklich verwenden willst.