Ga naar inhoud

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


anoniem

Aanbevolen berichten

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.
Link naar reactie
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
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...