Hello Anton! Testing the root TThread class, we made some experiences running a class member function as a (Linux-)pthread, which might help you. Since pthread_create (and also the TThread constructor) expects a C function to be run, it needs the pointer to the class instance as function argument (4th argument of pthread_create), if you want to run a member function of this C++ class. When C++ methods are called from within a class, internally the class instance pointer ("this") is always passed as invisible first argument. Thus the "C" call of any C++ member function by pointer requires the class object address as first argument... For example, in root TThread class, the implementation for pthreads (THREAD_PosixThread.cxx) starts the member function void* TThread::Fun (which calls your own function passed to the TThread constructor) as pthread with the pointer to the TThread instance TThread* th as argument: int ierr = pthread_create(&id, attr, &TThread::Fun,th); (in method TPosixThread::Run(TThread* th)) Additionally, if you want to run a member void myfunction of any class Myclass as TThread, you also have to pass the address to the class as function argument of TThread constructor, since TThread::Fun uses a C function call to invoke your function: TThread* mythread= new TThread("My Thread", (void(*) (void *)) &Myclass::myfunction, (void*) &Myclass); mythread->Run(); when you create TThread from within class Myclass, you may write TThread* mythread= new TThread("My Thread", (void(*) (void *)) &myfunction, (void*) this); mythread->Run(); The required cast of &myfunction produced a compiler warning in our tests (egcs-2.91.66 Debian GNU/Linux (egcs-1.1.2 release)); however, the example was compiled and runs. I hope this may be useful for you; best regards, Joern (Joern Adamczewski, go4 team DV&EE GSI Darmstadt) KOSU_FOKIN@garbo.lucas.lu.se wrote: > Hello rooters! > > I am trying to play around C++ implementation of posix threads and I realise > that I can't pass a class member function into pthread_create() which takes an > address of a function (void*) as the third argument. It says > > "builder.cxx", line 122: Error: Formal argument 3 of type void*(*)(void*) > in call to pthread_create(unsigned*, const _pthread_attr*, void*(*)(void*), void*) > is being passed void*(TVME::*)(void*). > > Could someone tell me how to solve the problem? > > It also says on the web in Linux FAQ > > F.2: I'm trying to use LinuxThreads from a C++ program, and the compiler complains about the third argument to pthread_create() ! > You're probably trying to pass a class member function or some other C++ thing as third > argument to pthread_create(). Recall that pthread_create() is a C function, and it must be > passed a C function as third argument. > > But that's rather strange ... > > I suppose that ROOT OO thread wrapper does this job. How? > > Best regards, > Anton
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:40 MET