And I can't deal with your C code either, especially as it's far from short.
I never claimed that creating a multi-tasking system would be trivial? 60 lines is pretty short, and I presented it in even smaller sections.
Besides, the point is the following producer-consumer example runs and I only used the principles I said I used:
void *main_thread( void* dummy ) {
(void)dummy;
// Create the threads.
ThreadId thread1_id = create_thread( func1, NULL );
ThreadId thread2_id = create_thread( func2, NULL );
// Wait for them to finish.
wait_for_thread( thread1_id );
wait_for_thread( thread2_id );
return NULL;
}
void *func1( void *dummy ) {
(void)dummy;
for ( int i=5; i--; ) {
printf( "func1\n" );
if ( i )
thread_sleep( 1 );
}
return NULL;
}
void *func2( void *dummy ) {
(void)dummy;
for ( int i=5; i--; ) {
printf( "func2\n" );
if ( i )
thread_sleep( 1 );
}
return NULL;
}
I disagree, most probably your assumptions are based on some C lang specific conventions including call stack manipulations.
The first line from your link: "Coroutines are computer program components that allow execution to be suspended and resumed".
Suspending and resuming a function requires saving where it's at (execution pointer) and it's state (call stack incl lexicals).
Nothing about C or any other language here. You'll find the same thing in Perl coros (Coro) and everywhere else coros exist.
The first yield-to example with routines translates 1to1
Neither examples can be achieved using goto &sub. goto &sub can't be used to jump into the middle of a sub from outside a sub, much less restore the existing lexical state that existed when that point in the sub was previously reached. And I have no idea what you think would save that state in the first place.
|