#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<asm/unistd.h>
void * T_Routine( void * param) ;
int main( int argc, char * argv[ ] )
{
int i;
int * ran_ret;
pthread_t tid1, tid2, tid3;
pthread_attr_t attr1, attr2;
pthread_attr_init( & attr1) ;
pthread_attr_init( & attr2) ;
pthread_attr_setdetachstate( & attr2, PTHREAD_CREATE_DETACHED) ;
pthread_create( & tid1,& attr1, T_Routine, "1" ) ; //attr1 can be NULL
pthread_create( & tid2,& attr1, T_Routine, "2" ) ; //attr1 can be NULL
pthread_create( & tid3,& attr2, T_Routine, "3" ) ;
pthread_join( tid1, ( void ** ) ( & ran_ret) ) ;
pthread_join( tid2, NULL) ;
for ( i= 1 ; i<= ran_ret[ 0 ] ; i++ )
return 0 ;
}
// runner function
void * T_Routine ( void * param )
{
int i, N, K;
int * ran;
printf ( "PID=%d,PID_TID=%d\n " , getpid
( ) , syscall
( __NR_gettid
) ) ; if ( N== 1 )
{
K= 5 ;
ran
= ( int * ) malloc ( ( K
+ 1 ) * sizeof ( int ) ) ; ran[ 0 ] = 5 ;
printf ( "Random value from thread 1\n " ) ; for ( i= 1 ; i<= ran[ 0 ] ; i++ )
pthread_exit( ran) ;
}
else if ( N== 2 )
{
pthread_detach( pthread_self( ) ) ;
pthread_exit( 0 ) ;
}
else if ( N== 3 )
{
pthread_exit( 0 ) ;
}
}
I2luY2x1ZGU8cHRocmVhZC5oPiAKI2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPGFzbS91bmlzdGQuaD4Kdm9pZCAqVF9Sb3V0aW5lKHZvaWQgKnBhcmFtKTsKaW50IG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQp7CglpbnQgaTsKCWludCAqcmFuX3JldDsKCXB0aHJlYWRfdCB0aWQxLCB0aWQyLCB0aWQzOwkKCXB0aHJlYWRfYXR0cl90IGF0dHIxLCBhdHRyMjsgCglwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cjEpOwoJcHRocmVhZF9hdHRyX2luaXQoJmF0dHIyKTsKCXB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0cjIsUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwoJcHRocmVhZF9jcmVhdGUoJnRpZDEsJmF0dHIxLFRfUm91dGluZSwiMSIpOy8vYXR0cjEgY2FuIGJlIE5VTEwKCXB0aHJlYWRfY3JlYXRlKCZ0aWQyLCZhdHRyMSxUX1JvdXRpbmUsIjIiKTsgLy9hdHRyMSBjYW4gYmUgTlVMTAoJcHRocmVhZF9jcmVhdGUoJnRpZDMsJmF0dHIyLFRfUm91dGluZSwiMyIpOwoJcHRocmVhZF9qb2luKHRpZDEsKHZvaWQgKiopKCZyYW5fcmV0KSk7CglwdGhyZWFkX2pvaW4odGlkMixOVUxMKTsKCXByaW50ZigiUmFuZG9tIG51bWJlcnNcbiIpOwoJZm9yKGk9MTtpPD1yYW5fcmV0WzBdO2krKykKCQlwcmludGYoIiVkXHQiLHJhbl9yZXRbaV0pOwoJcHJpbnRmKCJcbiIpOwoJZnJlZShyYW5fcmV0KTsKCXJldHVybiAwOwkKfQoKLy8gcnVubmVyIGZ1bmN0aW9uCnZvaWQgKlRfUm91dGluZSAoIHZvaWQgKnBhcmFtICkKeyAJCglpbnQgaSxOLEs7CglpbnQgKnJhbjsKCU4gPSBhdG9pKHBhcmFtKTsKCXByaW50ZigiUElEPSVkLFBJRF9USUQ9JWRcbiIsZ2V0cGlkKCksc3lzY2FsbChfX05SX2dldHRpZCkpOwoJaWYoTj09MSkKCXsKCQlLPTU7CgkJcmFuPShpbnQgKiltYWxsb2MoKEsrMSkqc2l6ZW9mKGludCkpOwoJCXJhblswXT01OwoJCXJhblsxXT1yYW5kKCk7CgkJcmFuWzJdPXJhbmQoKTsKCQlyYW5bM109cmFuZCgpOwoJCXJhbls0XT1yYW5kKCk7CgkJcmFuWzVdPXJhbmQoKTsKCQlwcmludGYoIlJhbmRvbSB2YWx1ZSBmcm9tIHRocmVhZCAxXG4iKTsKCQlmb3IoaT0xO2k8PXJhblswXTtpKyspCgkJCXByaW50ZigiJWRcdCIscmFuW2ldKTsKCQlwcmludGYoIlxuIik7CgkJcHRocmVhZF9leGl0KHJhbik7Cgl9CgllbHNlIGlmKE49PTIpCgl7CgkJcHRocmVhZF9kZXRhY2gocHRocmVhZF9zZWxmKCkpOwoJCXB0aHJlYWRfZXhpdCgwKTsKCX0KCWVsc2UgaWYoTj09MykKCXsKCQlwdGhyZWFkX2V4aXQoMCk7Cgl9Cn0K