[SDL] Re: Threads ! I'am off topic, but I hope someone could help me !

dancer at zeor.simegen.com dancer at zeor.simegen.com
Tue Jun 27 15:26:56 PDT 2000


Anes Lihovac wrote:

> Hello !
>
> I have written some classes which are multithreaded.
>
> I am creating a thread out of a method which is called
> once the object is created, eg:
>
> class myClass
> {
>
>   public:
>         myClass(){StartServer();}
>
>         void StartServer();
>         void doSomething();
> }
>
> ..
> .
>
> void myClass::StartServer()
> {
>         pthread_t thread;
>
>         pthread_create(&thread,NULL,&doSomething,(void*)this);
> }
>
> Okay this worked fine at every time(during compiling there are a few
> warnings!),
> but now I have changed my compiler from egcs-2.95.1 to egcs-2.95.2 and
> it won't compile
> any more.It breaks with an error message:
>
> test.cpp: In method `void myClass::startServer()':
> test.cpp:30: no matches converting function `function' to type `void *
> (*)(void *)'
> test.cpp:13: candidates are: void myClass::function()
>
> I don't know why, and how to solve it.
>
> I know their is a threads newsgroup, but there wasn't someone who could
> help me.
>
> Thanks in advance and best regards
>
> Ciao
> Anes

Try something like this:

#include <pthread.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

class   Pthread
        {
        public:
        // Create a new thread
        Pthread(void *(*__start_routine)(void *),void *__arg);
        // Die gracefully
        ~Pthread();
        void    *arg(void);     // return passed argument
        void *(*startup)(void *);       // What function to execute

        private:
        void    *__argdata;

        };



extern "C" {static      void *thread_start(Pthread *thread)
{
        void    *x;

        // Start the routine that the user _actually_ wanted
        x=thread->startup(thread->arg());

        // at the end, we delete the thread
        delete thread;

//      pthread_exit(x);
        return x;
}
}

Pthread::Pthread(void *(*__start_routine)(void *),void *__arg)
{

#if USEFUL_OCCASIONALLY
        struct rlimit rlim;
        getrlimit(RLIMIT_NOFILE,&rlim);
        if(rlim.rlim_cur>200)
                {
                rlim.rlim_cur=200;
                rlim.rlim_max=200;
                }
        setrlimit(RLIMIT_NOFILE,&rlim);
#endif

        pthread_t       thread_id;

        // Store the argument data
        __argdata=__arg;

        // Store the startup position
        startup=__start_routine;

        // Create the thread, passing a pointer to self
        while(pthread_create(&thread_id,0,thread_start,(void *)this))
                {
                // Thread creation failed. What now?
                sleep(1);
                }
}

void    *Pthread::arg(void)
{
        return __argdata;
}


Pthread::~Pthread()
{
        // Nothing.
}


Then create a new thread with:

new Pthread(start_func,arg_val);

(Yes, the pointer isn't stored. The class deconstructs itself)

D





More information about the SDL mailing list