Boost::thread funktion mit Parameter übergeben



  • Hallo

    ich meiner main will ich einen thread erstellen und diesem eine funktion mit parameter übergeben.

    Test eine Objekt der Klasse a.
    nun will ich mit dem Thread eine funktion des Objektes,der Klasse a, aufrufen.

    Nur wie

    void Package(a obj)
    {
    ......
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    ...
    
    	a test;
    
    	boost::thread t(Package(test));
    
    ...
    

    Doch leider klappt der aufruf nicht sobald ich parameter übergebe.

    Wäre nett wenn mir jemand helfen könnte.

    Ich will quasi auf ein globales Objekt mit mehreren Threads zugreifen.



  • Hi,

    http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread

    Dich dürfte dort "Thread Constructor with arguments" interessieren.

    Was willst du denn genau machen?
    Sollen die Threads uaf ein und das selbe Objekt zugreifen oder reicht eine Kopie?

    _Sascha_



  • Hallo,
    also ich will, dass zur Laufzeit auf genau ein Objekt mit mehreren Threads zugegriffen wird.
    Z.B. ein Thread fügt dem Objekt daten hinzu.
    Ein anderer nimmt diese Daten (oder bereits vorher entstandene) und verarbeitet diese.

    Also z.B. ein Thread schreibt Daten in eine Liste des Objekts.

    Ein anderer thread: sobald daten existieren etwas mit ihnen macht aber weiterhin neue daten entstehen können.

    Ich weiß nicht, aber vllt sowas wie Singleton mit mehreren Unterthreads.

    Zur zeit läuft in meinem Projekt alles nacheinader ab. In zukunft sollen die entstandenen Daten direkt bearbeitet werden. Und nicht erst nachdem alle daten entstanden sind. Denn es ist nicht bekannt wie viele daten es gibt



  • Hi,

    wenn du das mit der Parameterübergabe richtig hin bekommen hast, solltest du auch darauf achten dass du den Threads Zeiger auf das objekt gibst.

    Des weiteren solltest du auch die Threads synchronisieren z.B. mit Mutexen oder Critical sections, dass nicht zwei Threads gleichzeitig das Objekt bearbeiten.

    _Sascha_



  • free118 schrieb:

    Hallo

    ich meiner main will ich einen thread erstellen und diesem eine funktion mit parameter übergeben.

    Test eine Objekt der Klasse a.
    nun will ich mit dem Thread eine funktion des Objektes,der Klasse a, aufrufen.

    Nur wie

    void Package(a obj)
    {
    ......
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    ...
    	
    	a test;
    	
    	boost::thread t(Package(test));
    
    ...
    

    Doch leider klappt der aufruf nicht sobald ich parameter übergebe.

    Wäre nett wenn mir jemand helfen könnte.

    Ich will quasi auf ein globales Objekt mit mehreren Threads zugreifen.

    Beides aus dem Stehgreif und ungetestet, kann sein dass ich ein paar Kleinigkeiten übersehen habe/Tippfehler etc.:

    a)

    void Package(a obj)
    {
    // ...
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    // ...
    
    	a test;
    
    	boost::thread t(boost::bind(&Package, test));
    
    // ...
    

    b)

    class PackageFunctor
    {
    public:
        typedef void result_type;
    
        explicit PackageFunctor(a obj) : m_obj(obj)
        {
        }
    
        void operator ()()
        {
            // ...
        }
    private:
        a m_obj;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    // ...
    
    	a test;
    
    	boost::thread t(PackageFunctor(test));
    
    // ...
    

    In beiden Fällen wird "test" kopiert, d.h. du musst beachten was _Sascha_ geschrieben hat (-> Zeiger übergeben).
    Die nötige Änderung ist in meinem Beispiel *nicht* enthalten.


Anmelden zum Antworten