summaryrefslogtreecommitdiff
path: root/docs/tutorials/007/page09.html
blob: 3331cd46a4fc1d2ff9a1d2488254a8c2a4b95b20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!-- $Id$ -->
<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
   <META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (X11; I; Linux 2.0.32 i486) [Netscape]">
   <META NAME="Author" CONTENT="James CE Johnson">
   <META NAME="Description" CONTENT="A first step towards using ACE productively">
   <TITLE>ACE Tutorial 007</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#000FFF" VLINK="#FF0F0F">

<CENTER><B><FONT SIZE=+2>ACE Tutorial 007</FONT></B></CENTER>

<CENTER><B><FONT SIZE=+2>Creating a thread-pool server</FONT></B></CENTER>
<HR>

<P>That's it for Tutorial 7.&nbsp; As with Tutorial 6, we really didn't
have to change much to introduce a new threading strategy.&nbsp; Most of
the work was in creating the Thread_Pool object itself.&nbsp; Everything
else was just minor housekeeping.

<P>There is a fourth common thread strategy:&nbsp; thread-per-request.&nbsp;
It's not one of my favorites, so I wasn't planning to go into it.&nbsp;
If you want to contribute a tutorial on that topic though, I'll be glad
to include it here.

<P>For reference, here's the file list again:
<UL>
<LI>
<A HREF="Makefile">Makefile</A></LI>

<LI>
<A HREF="client_acceptor.h">client_acceptor.h</A></LI>

<LI>
<A HREF="client_acceptor.cpp">client_acceptor.cpp</A></LI>

<LI>
<A HREF="client_handler.cpp">client_handler.cpp</A></LI>

<LI>
<A HREF="client_handler.h">client_handler.h</A></LI>

<LI>
<A HREF="server.cpp">server.cpp</A></LI>

<LI>
<A HREF="thread_pool.h">thread_pool.h</A></LI>

<LI>
<A HREF="thread_pool.cpp">thread_pool.cpp</A></LI>

</UL>
<P>
<HR WIDTH="100%">
<P>
<center><h2>Danger, Warning!</h2></center>
Now that I've gone through all of this to create a thread pool server,
I have to point out that this isn't exactly the best or safest way to
do so.  The biggest danger we face with this approach is the
possibility of an event handler existing in the thread pool's message
queue <i>after</i> it has been deleted.  When the thread's svc()
method attempts to invoke <i>handle_input()</i> you will get a nasty
core dump.
<p>
The safest way to handle the situation is to use reference-counted
pointers everywhere a Client_Handler pointer would be used.  That's
beyond the scope of the tutorial but I encourage you to give it a
try.  If you want to contribute that back as an enhanced Tutorial,
I'll be glad to include it.
<p>
Another approach that should work quite well is to use the
ACE_TP_Reactor instead of just ACE_Reactor.  This takes a little more
setup but results in a cleaner implementation.  Again, I've not had
time to develop a Tutorial on the TP_Reactor but would welcome any
contributions.
<P><HR WIDTH="100%">
<CENTER>[<A HREF="../online-tutorials.html">Tutorial Index</A>] </CENTER>