public inbox for pthreads-win32@sourceware.org
 help / color / mirror / Atom feed
From: "Bossom, John" <John.Bossom@Cognos.COM>
To: 'Wayne Isaacs' <wisaacs@io.com>, Ye Liu <yliu@tibco.com>,
	pthreads-win32@sourceware.cygnus.com,
	pthreads-win32-info@sourceware.cygnus.com
Subject: RE: Using a class method as starting routine.
Date: Tue, 31 Jul 2001 07:25:00 -0000	[thread overview]
Message-ID: <430F887D415DD1118C2700805F31ECF104AFA5E6@sota0005.cognos.com> (raw)

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
>
>

             reply	other threads:[~2001-07-31  7:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-07-31  7:25 Bossom, John [this message]
  -- strict thread matches above, loose matches on Subject: below --
2001-08-01  1:39 Gardian, Milan
2001-07-30 13:50 Ye Liu
2001-07-30 20:06 ` Wayne Isaacs
2001-07-31 12:09   ` Ye Liu
2001-07-31  2:11 ` Ales Pour

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=430F887D415DD1118C2700805F31ECF104AFA5E6@sota0005.cognos.com \
    --to=john.bossom@cognos.com \
    --cc=pthreads-win32-info@sourceware.cygnus.com \
    --cc=pthreads-win32@sourceware.cygnus.com \
    --cc=wisaacs@io.com \
    --cc=yliu@tibco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).