This preview shows page 1. Sign up to view the full content.
Unformatted text preview: fd); /* child services client */ Close(connfd); /* child closes connection with client */ exit(0); /* child exits */ } Close(connfd); /* parent closes connected socket (important!) */ } } code/net/echoserverp.c Figure 12.34: Concurrent echo server based on processes. 642 CHAPTER 12. NETWORK PROGRAMMING server based on threads to have better throughput (measured in clients serviced per second) than one based on processes. Second, because all threads share the same global variables and heap variables, it is much easier for threads to share state information. The major disadvantage of using threads is that the same memory model that makes it easy to share data structures also makes it easy to share data structures unintentionally and incorrectly. As we learned in Chapter 11, shared data must be protected, functions called from threads must be reentrant, and race conditions must be avoided. The threaded echo server in Figure 12.35 illustrates some of the subtle issues that can arise. The overall structure is similar to the process-based design. The main thread repeatedly waits for a connection request (line 22) and then creates a peer thread to handle the request (line 23). The ﬁrst issue we encounter is how to pass the connected descriptor to the peer thread when we call pthread create. The obvious approach is to pass a pointer to the descriptor:
1 2 connfd = Accept(listenfd, (SA *) &clientaddr, &clientlen); Pthread_create(&tid, NULL, thread, &connfd); an...
View Full Document