#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define max_ports 3
#define num_threads 6
sem_t portsemaphore;
void * open_port( void * thread_id) {
int tid = * ( ( int * ) thread_id) ;
printf ( "Thread %d: waiting to open port...\n " , tid
) ;
sem_wait( & portsemaphore) ;
printf ( "Thread %d: PORT OPENED\n " , tid
) ;
sleep( 2 ) ;
printf ( "Thread %d: closing port.\n " , tid
) ; sem_post( & portsemaphore) ;
return NULL;
}
int main( ) {
pthread_t threads[ num_threads] ;
int thread_ids[ num_threads] ;
sem_init( & portsemaphore, 0 , max_ports) ;
for ( int i = 0 ; i < num_threads; i++ ) {
thread_ids[ i] = i + 1 ;
pthread_create( & threads[ i] , NULL, open_port, & thread_ids[ i] ) ;
}
for ( int i = 0 ; i < num_threads; i++ ) {
pthread_join( threads[ i] , NULL) ;
}
sem_destroy( & portsemaphore) ;
printf ( "All threads finished.\n " ) ; return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojZGVmaW5lIG1heF9wb3J0cyAzCiNkZWZpbmUgbnVtX3RocmVhZHMgNgoKc2VtX3QgcG9ydHNlbWFwaG9yZTsKCgp2b2lkKiBvcGVuX3BvcnQodm9pZCAqdGhyZWFkX2lkKSB7CiAgICBpbnQgdGlkID0gKigoaW50ICopdGhyZWFkX2lkKTsKICAgIAogICAgcHJpbnRmKCJUaHJlYWQgJWQ6IHdhaXRpbmcgdG8gb3BlbiBwb3J0Li4uXG4iLCB0aWQpOwogICAgCiAgICBzZW1fd2FpdCgmcG9ydHNlbWFwaG9yZSk7IAogICAgcHJpbnRmKCJUaHJlYWQgJWQ6IFBPUlQgT1BFTkVEXG4iLCB0aWQpOwogICAgCiAgICBzbGVlcCgyKTsgCiAgICAKICAgIHByaW50ZigiVGhyZWFkICVkOiBjbG9zaW5nIHBvcnQuXG4iLCB0aWQpOwogICAgc2VtX3Bvc3QoJnBvcnRzZW1hcGhvcmUpOyAKICAgIAogICAgcmV0dXJuIE5VTEw7Cn0KCmludCBtYWluKCkgewogICAgcHRocmVhZF90IHRocmVhZHNbbnVtX3RocmVhZHNdOwogICAgaW50IHRocmVhZF9pZHNbbnVtX3RocmVhZHNdOwoKICAgIAogICAgc2VtX2luaXQoJnBvcnRzZW1hcGhvcmUsIDAsIG1heF9wb3J0cyk7CgogICAgZm9yKGludCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICB0aHJlYWRfaWRzW2ldID0gaSArIDE7CiAgICAgICAgCiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbaV0sIE5VTEwsIG9wZW5fcG9ydCwgJnRocmVhZF9pZHNbaV0pOwogICAgICAgIAogICAgfQoKICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKICAgICAgICBwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CiAgICB9CgogICAgc2VtX2Rlc3Ryb3koJnBvcnRzZW1hcGhvcmUpOwogICAgcHJpbnRmKCJBbGwgdGhyZWFkcyBmaW5pc2hlZC5cbiIpOwogICAgcmV0dXJuIDA7Cn0K