This is the mail archive of the pthreads-win32@sources.redhat.com mailing list for the pthreas-win32 project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Using a class method as starting routine.


Instead of attempting to be able to call every method of a class as the
thread mainline, you could simply follow the JAVA thread model:
Designate the 'run' method as the starting point of your thread object.

Register a static method as the internal guts that passes the thread
class pointer as the sole parameter to the static method. Within the
static method, coerce the pointer back into the thread object and
call thread->run()

(I know... not the original problem, however, it keeps life simple.)



-----Original Message-----
From: Wayne Isaacs [mailto:wisaacs@io.com]
Sent: July 30, 2001 11:05 PM
To: Ye Liu; pthreads-win32@sourceware.cygnus.com;
pthreads-win32-info@sourceware.cygnus.com
Subject: Re: Using a class method as starting routine.


I have never found a way to generate a usable function pointer from a
non-static class method.  It may be theoretically incorrect to even try,
because a non-static class method should not exist independently from the
data object.

On the other hand, if you declare the method 'static', then that method
exists independent of data.  The compiler will let you generate and use a
pointer to any static method.

I would be interested to know Bjarne Stroustrup's preference on this issue,
because the static function pointer required to launch thread routines is
contrary to object orientation, but a fact of life for the major operating
systems.

I have written several thread classes.  Usually, the class object carries a
thread function pointer and a termination event in private data.  The class
defines the thread function pointer as a typedef.  The thread function takes
two parameters; a void pointer for data, and an event pointer for
termination.  That way, when the thread class object goes out of scope and
destructs, it can gracefully terminate the thread.

something like:

class ThreadFn {

    pthread_t thread_id;
    HANDLE termination_event;

    public:
        typedef  long (*static_f_type)( HANDLE, void* );
        ThreadFn( static_f_type );

    };


Wayne

----- Original Message -----
From: "Ye Liu" <yliu@tibco.com>
To: <pthreads-win32@sourceware.cygnus.com>;
<pthreads-win32-info@sourceware.cygnus.com>
Sent: Monday, July 30, 2001 4:46 PM
Subject: Using a class method as starting routine.


> Greets,
>
> A rather dump question: how to use a class method as a starting routine
> of pthread_create().
>
> I have the following code:
> /*    create.h    */
> #ifndef _CREATE_H_
> #define _CREATE_H_
>
> #include <stdio.h>
> #include "pthread.h"
>
> class create
> {
> public:
>  create();
>  void *thread_routine(void *arg);
>  void start();
> };
>
> #endif
>
> /*    create.cpp    */
> #include "create.h"
>
> void *create::thread_routine(void *arg)
> {
>  printf("The thread is here\n");
>  return NULL;
> }
>
> void create::start()
> {
>  pthread_t thread_id;
>  pthread_attr_t thread_attr;
>
>  pthread_create(&thread_id, &thread_attr, create::thread_routine, NULL);
>
> }
>
> create::create()
> {
> }
>
> When I compiled it using VC6.0 (win32-pthread library of course), I got
>
> create.cpp
> C:\ye\work\vs\pthread_projects\create\create.cpp(14) : error C2664:
> 'pthread_create' : cannot convert parameter 3 from 'void *(void *)' to
> 'void *(__cdecl *)(void *)'
>         None of the functions with this name in scope match the target
> type
> Error executing cl.exe.
>
>
> It seems that the compiler does not recognize thread_routine as a
> address. Why does it happen? How to get around of it?
>
> Thanks a lot!
>
> --ye
>
>
> --
> Ye Liu
> Tel(O) 650-846-5228
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]