//gcc -o libmylib.so -shared -fpic mylib.c -lpthread #include "mylib.h" #include static lib_work_done_callback_t GCB; static void *GData; static void *run( void *Arg ) { sleep( 3 ); printf( "Calling callback() from thread.\n" ); GCB( GData ); /* crashes here */ printf( "Calling callback() from thread done.\n" ); return( NULL ); } int lib_RegisterWorkDoneCallback( void *a, lib_work_done_callback_t CB, void *Data ) { pthread_t thread; pthread_attr_t attr; int res = 0; GCB = CB; GData = Data; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); if( pthread_create( &thread, &attr, run, NULL ) ) { printf( "Error: Could not create thread.\n" ); res = 1; } pthread_attr_destroy( &attr ); return( res ); }