Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

[c++]Is het mogelijk om een lidfunctie als thread te starten

phaas
3 antwoorden
  • Ik programmeer in C++ onder Linux en maak gebruik van posix threads. Als ik een thread start, gebruik ik pthread_create() met de nodige argumenten, waaronder een pointer naar de functie die ik als thread wil starten. Gaat allemaal prima, maar ik zou graag ook een lidfunctie van een object als thread willen starten, en dat is me nog niet gelukt.
    Hopelijk weet iemand hier hoe dit moet ( en of dit uberhaupt ook maar kan ).

    grtz, plors

    PS. ik wil dit omdat ik zo makkelijk gebruik kan maken van klasse variabelen en niet steeds een struct met pointers hoef mee te geven.
  • Oke, het kan, dat is zeker ;)

    Dit is een ZEEEEER goede pthread-implentatie (niet zelf gemaakt, te weinig tijd :oops: )

    [b:fc3629a75b]::: lthread.h :::[/b:fc3629a75b]
    [code:1:fc3629a75b]
    #include <pthread.h>
    #ifndef _L_THREAD_H
    #define _L_THREAD_H

    void* threadFunc(void* arg);

    class Thread
    {
    public:

    Thread(){};

    ~Thread(){};

    virtual bool start() = 0;

    virtual void run() = 0;

    virtual bool wait() = 0;

    virtual void terminate() = 0;

    virtual long id() const = 0;

    private:

    Thread(const Thread& copy);
    Thread& operator = (const Thread& rhs);

    };

    class Mutex
    {
    public:

    Mutex(){};

    ~Mutex(){}

    virtual void lock() const = 0;

    virtual void unlock() const = 0;

    virtual bool tryLock() const = 0;

    };

    class PosixMutex : Mutex
    {
    public:

    PosixMutex();

    ~PosixMutex();

    void lock() const;

    void unlock() const ;

    bool tryLock() const ;

    private:

    pthread_mutex_t _mutex;

    };

    class PosixThread : public Thread
    {
    public:

    PosixThread():_tid(0),_finished(false){};

    ~PosixThread(){};

    bool start();

    bool wait();

    void terminate();

    long id() const
    { return _tid; };

    bool finished() const;

    protected:

    void finished(bool newVal)
    { _finished = newVal; };

    private:

    bool _finished;
    pthread_t _tid;

    PosixMutex _threadMutex;

    };

    #endif
    [/code:1:fc3629a75b]

    [b:fc3629a75b]::: lthread.cpp :::[/b:fc3629a75b]
    [code:1:fc3629a75b]
    #include <errno.h>
    #include "lthread.h"

    void* threadFunc(void* arg)
    {
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
    Thread* thr = (Thread*)arg;
    thr->run();
    return NULL;
    }


    bool PosixThread::start()
    {
    // fix SMP bug accesseing _tid before fully created
    return (pthread_create(&_tid, NULL, threadFunc, this) == 0);
    }

    bool PosixThread::wait()
    {
    return (pthread_join(_tid,NULL) == 0);
    }

    void PosixThread::terminate()
    {
    _threadMutex.lock();
    _finished = true;
    _threadMutex.unlock();
    pthread_cancel(_tid);
    }

    bool PosixThread::finished() const
    {
    bool retValue;
    _threadMutex.lock();
    retValue = _finished;
    _threadMutex.unlock();
    return retValue;

    }
    PosixMutex::PosixMutex()
    {
    // setup with default attributes
    pthread_mutex_init(&_mutex, NULL);
    }
    PosixMutex::~PosixMutex()
    {
    // cleanup
    pthread_mutex_destroy(&_mutex);
    }

    void PosixMutex::lock() const
    {
    pthread_mutex_lock((pthread_mutex_t*)&_mutex);
    }

    void PosixMutex::unlock() const
    {
    pthread_mutex_unlock((pthread_mutex_t*)&_mutex);
    }

    bool PosixMutex::tryLock() const
    {
    return (pthread_mutex_trylock((pthread_mutex_t*)&_mutex) != EBUSY);
    }
    [/code:1:fc3629a75b]

    [b:fc3629a75b] ::: Een leuk voorbeeldje ::: [/b:fc3629a75b]
    [code:1:fc3629a75b]
    #include <iostream.h>
    #include <unistd.h>
    #include "lthread.h"

    class myThread : public PosixThread
    {
    void run()
    {
    cout << "Dit is een thread :P";
    sleep(5);
    }

    };

    main()
    {
    myThread thread1;
    myThread thread2;
    myThread thread3;
    thread1.start();
    thread2.start();
    thread3.start();
    thread1.wait(); // wait() is gelijk aan pthread_join()
    thread2.wait();
    thread3.wait();
    cout << "Threads klaar!!";
    return;
    }
    [/code:1:fc3629a75b]
    Voorbeeld in NIET getest, slechts een indicatie!!

    En hoe maak ik nu van lthread.cpp een shlib?
    [i:fc3629a75b]gcc -o lthread.so lthread.cpp -shared -lpthread [/i:fc3629a75b]

    Je maakt evt je app met:
    [i:fc3629a75b]gcc -o main main.cpp -llthread -L.[/i:fc3629a75b] (miscchien [i:fc3629a75b]-lpthread[/i:fc3629a75b], anders [i:fc3629a75b]-rdynamic[/i:fc3629a75b])
    [i:fc3629a75b]export LD_LIBRARY_PATH=$PWD[/i:fc3629a75b] (anders kunnen libs niet worden geladen uit de huidige dir, zie /etc/ld.so.conf)
    [i:fc3629a75b]./main[/i:fc3629a75b]
    Et voila!

    OOOOOF gewoon:
    [i:fc3629a75b]gcc -o main main.cpp lpthread.cpp -lpthread
    ./main[/i:fc3629a75b]
    :D

    Suc6
    Barry
  • en bedankt :D

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.