Download presentation
Presentation is loading. Please wait.
Published byMarybeth Hensley Modified over 9 years ago
1
Threads and Locking Ioctl operations
2
Threads Lightweight processes What’s wrong with processes? –fork() is expensive – 10 to 100 times slower –Inter process communication For returning information from child to parent
3
Threads… Shared components –Global memory –Instructions –Most data –Open descriptors (files, sockets etc) –Signal handlers Not shared… –Thread ID –Registers, Program counter, stack pointer –Stack –Errno –Signal mask –Priority
4
Creation Thread equivalent of fork() int pthread_create( pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg ); Returns 0 is OK, and non-zero (> 0) if error.
5
Termination Return from initial fuction. void pthread_exit(void * status) exit() called by any thread main() returns
6
Waiting for child thread to exit int pthread_join(pthread_t tid, void **status) Equivalent of waitpid()
7
Detaching a thread The detached thread can act as daemon thread The parent thread doesn’t need to wait int pthread_detach(pthread_t tid) Detaching self : pthread_detach(pthread_self())
8
Echo client-server Server S1S2 Read Thread Write Thread Read Thread Write Thread listenfd Read Write Read Client1 Client2
9
Thread-based Echo Server
10
main() { int listenfd, connfd; int len; /* Start the usual way */ listenfd = Socket(…); Bind(listenfd, …); Listen(listenfd, …) for ( ; ; ) { len = addrlen; connfd = Accept(listenfd, …); /* Create a thread in service_func routine */ Pthread_create(NULL, NULL, service_func, (void *) connfd); }
11
void * service_func(void *arg) { int local_connfd; /* release parent from waiting */ Pthread_detach(pthread_self()); /* extract connfd from argument */ local_connfd = (int) arg; /* receive and echo client’s message */ str_echo(local_connfd); /* Terminate the connection */ Close(local_connfd); return(NULL); }
12
Thread-based Echo Client
13
int sockfd; FILE *fp; main() { pthread_t tid; fp = fopen(…); /* Start the usual way */ sockfd = Socket(…); … Connect(…); /* Create a thread to send data */ Pthread_create(&tid, NULL, write_func, NULL); /* read data from sockfd */ read_func(); /* wait for child thread */ Pthread_join(tid, NULL); }
14
void * write_func(void *arg) { char sendline[MAXLINE]; while( more data in fp) Read from fp into sendline[]; write sendline[] into sockfd; Shutdown(sockfd, SHUT_WR); return(NULL); } void read_func() { char recvline[MAXLINE]; while ( more data from sockfd) read from sockfd into recvline[]; write from recvline[] to stdout; }
15
Mutex – for mutual exclusion int counter = 0; void *thread_func(void *arg) { int val; /* unprotected code – why? */ val = counter; counter = val + 1; return NULL; }
16
Mutex… int counter = 0; ptread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void *thread_func(void *arg) { int val; /* protected by mutex */ Pthread_mutex_lock( &mutex ); val = counter; counter = val + 1; Pthread_mutex_unlock( &mutex ); return NULL; }
17
Condition Variable – for signaling Think of Producer – consumer problem Producers and consumers run in separate threads. Producer produces data and consumer consumes data. Consumer has to inform producer when data is available
18
Without condition variables
19
/* Globals */ int data_avail = 0; int pthread_mutex_t data_mutex =PTHREAD_MUTEX_INITIALIZER; void *producer(void *) { Pthread_mutex_lock(&data_mutex); Produce data Insert data into queue; data_avail++; Pthread_mutex_unlock(&data_mutex); consume_data(); }
20
void *consumer(void *) { Pthread_mutex_lock(&data_mutex); while( !data_avail ) /* do nothing – keep looping!!*/; Extract data from queue; if (queue is empty)data_avail = 0; Pthread_mutex_unlock(&data_mutex); consume_data(); }
21
With condition variables
22
int data_avail = 0; int pthread_mutex_t data_mutex =PTHREAD_MUTEX_INITIALIZER; int pthread_cont_t data_cond = PTHREAD_COND_INITIALIZER; void *producer(void *) { Pthread_mutex_lock(&data_mutex); Produce data Insert data into queue; data_avail++; Pthread_cond_signal(&data_cond); Pthread_mutex_unlock(&data_mutex); consume_data(); }
23
void *consumer(void *) { Pthread_mutex_lock(&data_mutex); while( !data_avail ) { /* sleep on condition variable*/ Pthread_cond_wait(&data_cond, &data_mutex); } /*woken up */ Extract data from queue; if (queue is empty)data_avail = 0; Pthread_mutex_unlock(&data_mutex); consume_data(); }
24
ioctl()
25
Handles miscellaneous properties of a file/device referenced by a descriptor. –In our case, network interfaces. int ioctl(int fd, int request, void * arg) –Socket operations –File operations –Interface configuration –ARP cache –Routing table
26
SIOSPGRP/SIOGPGRP –set/get process/group ID of a socket FIONREAD –Return number of bytes in socket buffer SIOCGIFCONF –Get list of all interfaces SIOCGIFBRDADDR/ SIOCSIFBRDADDR –Get/set broadcast address SIOCGARP/SIOCSARP/SIOCDARP –Get/modify/delete ARP cache entry. SIOCADDRT/SIOCDELRT –Add/delete routes
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.