Vraag & Antwoord

Programmeren

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

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

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

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