[C/C++] Boost::thread

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Chillikid, 11. Juni 2009 .

  1. 11. Juni 2009
    Boost::thread

    Hey,

    Veraltet, neue Frage unten^^
    Spoiler
    ich habe ein Problem mit den boost::threads und hoffe dabei kann mir jemand helfen:

    Code:
    class X 
    {
     X(int a);
     bool getPage(string &url, string &buffer);
    };
    In der main will ich das dann als Thread aufrufen:
    Code:
    Definition von url und buf
    ...
    X x(8);
    boost::thread thrd1(boost::bind(&X::getPage, boost::ref(x), _1, _2)(url, buf));
    ...
    
    Beim Übersetzen kriege ich jetzt folgenden Fehler:
    Wisst ihr was ich ändern muss? Denn ich persönlich werde aus der Meldung nicht schlau...
    // Lösung gefunden
    Ach boost ist gemein^^ Die offizielle Dokumentation hat mich dazu verleitet die Argumente mit den _1 und so weiter zu übergeben, aber wenn man das nicht macht funktionierts -.-*


    Stattdessen wüsste ich jetzt aber gerne wie ich bei einem solche Aufrufe

    Code:
    class X 
    {
     X(int a);
     bool getPage(string &url, string &buffer);
    };
    
    boost::thread thrd1( boost::bind( &X::getPage, boost::ref(x), url, buf ) );
    
    o.ä. den Rückgabewert der Funktion bekommen kann.

    Weiterhin, wenn innerhalb eines Threads eine Funktion aufgerufen wird, muss diese dann auch über mutexes gesichert sein oder nur, wenn sie auf irgendetwas öffentliches schreibend zugreift?
     
  2. 11. Juni 2009
    AW: Boost::thread

    Zu dem Rückgabewert habe ich gerade keine Antwort, aber Mutex kommt immer dann zum Einsatz, wenn du auf ein globales Objekt zugreifst. Dann aber auch nur, wenn die Fkt. etwas schreibt und nicht, wenn nur gelesen wird. Beim Lesen kann auf Mutex verzichtet werden!

    greez

    //Nun mal zu deiner ersten Frage:
    Würde vllt die Klasse (wenn du darauf zugreifen kannst) um eine Funktion erweitern, die vom Typ void ist und als zusätzlichen Parameter ein Referenzobjekt benötigt, das vom selben Typ ist wie der Rückgabewert der Funktion bool getPage(string &url, string &buffer); (Also bool). Dann kannst du einfach ein globales Objekt übergeben und dieses Objekt überprüfen. Also sollte dann evtl so aussehen:

    Code:
    class X 
    {
     X(int a);
     bool getPage(string &url, string &buffer);
     void return_value_to_var(string &url, string &buffer, bool &returnValue);
    };
    
    void X::return_value_to_var(string &url, string &buffer, bool &returnValue)
    {
     returnValue = getPage(string url, string buffer);
    }
    
    Dann rufst du im Thread einfach die Fkt return_value_to_var() mit einer globalen bool Variablen als Argument auf. Das erhält ja dann das Ergebnis. Solltest du dann aber mit nem Mutex sichern

    Das ist nur eine mögliche Version. Vllt geht es viel einfacher
     
  3. 12. Juni 2009
    AW: Boost::thread

    Danke für deine Antwort. Ich denke ich werde erstmal auf deine Zwischenlösung zurückgreifen

    Ich lass aber trotzdem mal offen für den Fall das jemand weiß, wie mans richtig macht^^

    // Oh, mir fällt gerade noch ne Frage ein:
    Wenn ich innerhalb eines Threads z.B. eine globale Variable prüfe und diese mit einer komplett anderen Funktion (auch als Thread) verändere, greift dann auch dort der Mutex? Also bspw.:

    Beides als Thread aufrufen. Funktioniert das vernünftig?
     
  4. 12. Juni 2009
    AW: Boost::thread

    Sobald ein Thread auf ein globales Objekt zugreift und dann auch hineinschreiben sollte, muss diese geschützt werden... eben durchein Mutex. Da spielt es keine Rolle, ob das direkt durch die Threadfunktion geschieht oder indirekt durch eine Funktion, die im Thread aufgerufen wird. Es kann ja nach wie vor zu einem Zugriffsproblem kommen, wenn zwei oder mehr Threads versuchen in ein und das selbe Objekt zu schreiben

    greez
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.