From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Wayne Isaacs" To: "Ye Liu" , , Subject: Re: Using a class method as starting routine. Date: Mon, 30 Jul 2001 20:06:00 -0000 Message-id: <000901c1196d$cd9ccea0$6601a8c0@stone> References: <3B65C795.A5680EC7@tibco.com> X-SW-Source: 2001/msg00072.html 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" To: ; 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 > #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 > >