Posix Thread in einer Klasse



  • Guten Abend 🙂
    Ich denke der Titel beschreibt mein Problem recht exakt. Ich wäre für ein minimalistisches Beispiel dankbar.

    Vielen Dank 🙂



  • http://www.linuxselfhelp.com/HOWTO/C++Programming-HOWTO-18.html oder Boost nehmen.

    class Thread
    {
    	public:
    		Thread();
    		virtual ~Thread();
    
    		// Startet die Methode run() in einem eigenen Thread
    		int start();
    
    		// Threadroutine, wird von start()/entry() in einem
    		// eigenen Thread gestartet
    		virtual void run() = 0;
    
    		// true wenn run gerade in einem eigenen thread ausgefuerhrt weird
    		bool running();
    
    		// Wartet auf die Beendigung des Threads
    		int join();
    
    		// Freigeben der Ressourcen, siehe pthread_detach
    		int detach();
    
    	private:
    		// Eintrittspunkt fuer das Starten des Threads
    		// nimmt this als Argument, und fuert dann
    		// run aus, wird von start() benutzt
    		static void* entry(void* me);
    
    	private:
    		Thread(const Thread&);
    		pthread_t threadId;
    		bool state;
    };
    
    Thread::Thread()
    {
    	// create something
    	state = false;
    	threadId = 0;
    }
    
    Thread::~Thread()
    {
    	// destroy something
    	if ((threadId != 0) && (state))
    	{
    		pthread_cancel(threadId);
    	}
    }
    
    bool Thread::running()
    {
    	return state;
    }
    
    void* Thread::entry(void* me)
    {
    	//Thread* pthis = dynamic_cast<Thread*>(me);
    	//Thread* pthis = static_cast<Thread*>(me);
    	Thread* pthis = (Thread*)(me);
    
    	// soll immer und ueberall gecancelt werden koennen
    	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,0);
    	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,0);
    	pthis->state = true;
    	pthis->run();
    	pthis->state = false;
    	return 0;
    }
    
    int Thread::start()
    {
    	return pthread_create(&threadId, 0, Thread::entry, (void*)this);
    }
    
    int Thread::join()
    {
    	if ((threadId != 0) && (state))
    	{
    		return pthread_join(threadId, 0);
    	}
    	return -1;
    }
    
    int Thread::detach()
    {
    	if (threadId != 0)
    	{
    		return pthread_detach(threadId);
    	}
    	return -1;
    }
    

Anmelden zum Antworten