Thread entry points and c – Comtrol eCos User Manual

Page 42

Advertising
background image

Thread creation

cyg_thread_create(PRODUCER_PRIORITY, &producer, 0, "producer",

producer_stack, PRODUCER_STACKSIZE,

&producer_handle, &producer_thread);

cyg_thread_resume(producer_handle);

for (i = 0; i < NUMBER_OF_WORKERS; i++) {

cyg_thread_create(WORKER_PRIORITY, &worker, i, "worker",

worker_stacks[i], WORKER_STACKSIZE,

&(worker_handles[i]), &(worker_threads[i]));

cyg_thread_resume(worker_handles[i]);

}

}

Thread Entry Points and C++

For code written in C++ the thread entry function must be either a static member function of a class or an ordinary
function outside any class. It cannot be a normal member function of a class because such member functions take
an implicit additional argument

this

, and the kernel has no way of knowing what value to use for this argument.

One way around this problem is to make use of a special static member function, for example:

class fred {

public:

void thread_function();

static void static_thread_aux(cyg_addrword_t);

};

void

fred::static_thread_aux(cyg_addrword_t objptr)

{

fred* object = static_cast

<

fred*

>

(objptr);

object-

>

thread_function();

}

static fred instance;

extern "C" void

cyg_start( void )

{

...

cyg_thread_create( ...,

&fred::static_thread_aux,

static_cast

<

cyg_addrword_t

>

(&instance),

...);

...

}

Effectively this uses the

entry_data

argument to

cyg_thread_create

to hold the

this

pointer. Unfortunately

this approach does require the use of some C++ casts, so some of the type safety that can be achieved when
programming in C++ is lost.

42

Advertising