⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perlthrtut.pod

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 POD
📖 第 1 页 / 共 4 页
字号:
=head1 NAMEperlthrtut - Tutorial on threads in Perl=head1 DESCRIPTIONThis tutorial describes the use of Perl interpreter threads (sometimesreferred to as I<ithreads>) that was first introduced in Perl 5.6.0.  In thismodel, each thread runs in its own Perl interpreter, and any data sharingbetween threads must be explicit.  The user-level interface for I<ithreads>uses the L<threads> class.B<NOTE>: There was another older Perl threading flavor called the 5.005 modelthat used the L<Threads> class.  This old model was known to have problems, isdeprecated, and was removed for release 5.10.  You arestrongly encouraged to migrate any existing 5.005 threads code to the newmodel as soon as possible.You can see which (or neither) threading flavour you have byrunning C<perl -V> and looking at the C<Platform> section.If you have C<useithreads=define> you have ithreads, if youhave C<use5005threads=define> you have 5.005 threads.If you have neither, you don't have any thread support built in.If you have both, you are in trouble.The L<threads> and L<threads::shared> modules are included in the core Perldistribution.  Additionally, they are maintained as a separate modules onCPAN, so you can check there for any updates.=head1 What Is A Thread Anyway?A thread is a flow of control through a program with a singleexecution point.Sounds an awful lot like a process, doesn't it? Well, it should.Threads are one of the pieces of a process.  Every process has at leastone thread and, up until now, every process running Perl had only onethread.  With 5.8, though, you can create extra threads.  We're goingto show you how, when, and why.=head1 Threaded Program ModelsThere are three basic ways that you can structure a threadedprogram.  Which model you choose depends on what you need your programto do.  For many non-trivial threaded programs, you'll need to choosedifferent models for different pieces of your program.=head2 Boss/WorkerThe boss/worker model usually has one I<boss> thread and one or moreI<worker> threads.  The boss thread gathers or generates tasks that needto be done, then parcels those tasks out to the appropriate workerthread.This model is common in GUI and server programs, where a main threadwaits for some event and then passes that event to the appropriateworker threads for processing.  Once the event has been passed on, theboss thread goes back to waiting for another event.The boss thread does relatively little work.  While tasks aren'tnecessarily performed faster than with any other method, it tends tohave the best user-response times.=head2 Work CrewIn the work crew model, several threads are created that doessentially the same thing to different pieces of data.  It closelymirrors classical parallel processing and vector processors, where alarge array of processors do the exact same thing to many pieces ofdata.This model is particularly useful if the system running the programwill distribute multiple threads across different processors.  It canalso be useful in ray tracing or rendering engines, where theindividual threads can pass on interim results to give the user visualfeedback.=head2 PipelineThe pipeline model divides up a task into a series of steps, andpasses the results of one step on to the thread processing thenext.  Each thread does one thing to each piece of data and passes theresults to the next thread in line.This model makes the most sense if you have multiple processors so twoor more threads will be executing in parallel, though it can oftenmake sense in other contexts as well.  It tends to keep the individualtasks small and simple, as well as allowing some parts of the pipelineto block (on I/O or system calls, for example) while other parts keepgoing.  If you're running different parts of the pipeline on differentprocessors you may also take advantage of the caches on eachprocessor.This model is also handy for a form of recursive programming where,rather than having a subroutine call itself, it instead createsanother thread.  Prime and Fibonacci generators both map well to thisform of the pipeline model. (A version of a prime number generator ispresented later on.)=head1 What kind of threads are Perl threads?If you have experience with other thread implementations, you mightfind that things aren't quite what you expect.  It's very important toremember when dealing with Perl threads that I<Perl Threads Are Not XThreads> for all values of X.  They aren't POSIX threads, orDecThreads, or Java's Green threads, or Win32 threads.  There aresimilarities, and the broad concepts are the same, but if you startlooking for implementation details you're going to be eitherdisappointed or confused.  Possibly both.This is not to say that Perl threads are completely different fromeverything that's ever come before -- they're not.  Perl's threadingmodel owes a lot to other thread models, especially POSIX.  Just asPerl is not C, though, Perl threads are not POSIX threads.  So if youfind yourself looking for mutexes, or thread priorities, it's time tostep back a bit and think about what you want to do and how Perl cando it.However, it is important to remember that Perl threads cannot magicallydo things unless your operating system's threads allow it. So if yoursystem blocks the entire process on C<sleep()>, Perl usually will, as well.B<Perl Threads Are Different.>=head1 Thread-Safe ModulesThe addition of threads has changed Perl's internalssubstantially. There are implications for people who writemodules with XS code or external libraries. However, since Perl data isnot shared among threads by default, Perl modules stand a high chance ofbeing thread-safe or can be made thread-safe easily.  Modules that are nottagged as thread-safe should be tested or code reviewed before being usedin production code.Not all modules that you might use are thread-safe, and you shouldalways assume a module is unsafe unless the documentation saysotherwise.  This includes modules that are distributed as part of thecore.  Threads are a relatively new feature, and even some of the standardmodules aren't thread-safe.Even if a module is thread-safe, it doesn't mean that the module is optimizedto work well with threads. A module could possibly be rewritten to utilizethe new features in threaded Perl to increase performance in a threadedenvironment.If you're using a module that's not thread-safe for some reason, youcan protect yourself by using it from one, and only one thread at all.If you need multiple threads to access such a module, you can use semaphores andlots of programming discipline to control access to it.  Semaphoresare covered in L</"Basic semaphores">.See also L</"Thread-Safety of System Libraries">.=head1 Thread BasicsThe L<threads> module provides the basic functions you need to writethreaded programs.  In the following sections, we'll cover the basics,showing you what you need to do to create a threaded program.   Afterthat, we'll go over some of the features of the L<threads> module thatmake threaded programming easier.=head2 Basic Thread SupportThread support is a Perl compile-time option -- it's something that'sturned on or off when Perl is built at your site, rather than whenyour programs are compiled. If your Perl wasn't compiled with threadsupport enabled, then any attempt to use threads will fail.Your programs can use the Config module to check whether threads areenabled. If your program can't run without them, you can say somethinglike:    use Config;    $Config{useithreads} or die('Recompile Perl with threads to run this program.');A possibly-threaded program using a possibly-threaded module mighthave code like this:    use Config;    use MyMod;    BEGIN {        if ($Config{useithreads}) {            # We have threads            require MyMod_threaded;            import MyMod_threaded;        } else {            require MyMod_unthreaded;            import MyMod_unthreaded;        }    }Since code that runs both with and without threads is usually prettymessy, it's best to isolate the thread-specific code in its ownmodule.  In our example above, that's what C<MyMod_threaded> is, and it'sonly imported if we're running on a threaded Perl.=head2 A Note about the ExamplesIn a real situation, care should be taken that all threads are finishedexecuting before the program exits.  That care has B<not> been taken in theseexamples in the interest of simplicity.  Running these examples I<as is> willproduce error messages, usually caused by the fact that there are stillthreads running when the program exits.  You should not be alarmed by this.=head2 Creating ThreadsThe L<threads> module provides the tools you need to create newthreads.  Like any other module, you need to tell Perl that you want to useit; C<use threads;> imports all the pieces you need to create basicthreads.The simplest, most straightforward way to create a thread is with C<create()>:    use threads;    my $thr = threads->create(\&sub1);    sub sub1 {        print("In the thread\n");    }The C<create()> method takes a reference to a subroutine and creates a newthread that starts executing in the referenced subroutine.  Controlthen passes both to the subroutine and the caller.If you need to, your program can pass parameters to the subroutine aspart of the thread startup.  Just include the list of parameters aspart of the C<threads-E<gt>create()> call, like this:    use threads;    my $Param3 = 'foo';    my $thr1 = threads->create(\&sub1, 'Param 1', 'Param 2', $Param3);    my @ParamList = (42, 'Hello', 3.14);    my $thr2 = threads->create(\&sub1, @ParamList);    my $thr3 = threads->create(\&sub1, qw(Param1 Param2 Param3));    sub sub1 {        my @InboundParameters = @_;        print("In the thread\n");        print('Got parameters >', join('<>', @InboundParameters), "<\n");    }The last example illustrates another feature of threads.  You can spawnoff several threads using the same subroutine.  Each thread executesthe same subroutine, but in a separate thread with a separateenvironment and potentially separate arguments.C<new()> is a synonym for C<create()>.=head2 Waiting For A Thread To ExitSince threads are also subroutines, they can return values.  To waitfor a thread to exit and extract any values it might return, you canuse the C<join()> method:    use threads;    my ($thr) = threads->create(\&sub1);    my @ReturnData = $thr->join();    print('Thread returned ', join(', ', @ReturnData), "\n");    sub sub1 { return ('Fifty-six', 'foo', 2); }In the example above, the C<join()> method returns as soon as the threadends.  In addition to waiting for a thread to finish and gathering upany values that the thread might have returned, C<join()> also performsany OS cleanup necessary for the thread.  That cleanup might beimportant, especially for long-running programs that spawn lots ofthreads.  If you don't want the return values and don't want to waitfor the thread to finish, you should call the C<detach()> methodinstead, as described next.NOTE: In the example above, the thread returns a list, thus necessitatingthat the thread creation call be made in list context (i.e., C<my ($thr)>).See L<threads/"$thr->join()"> and L<threads/"THREAD CONTEXT"> for moredetails on thread context and return values.=head2 Ignoring A ThreadC<join()> does three things: it waits for a thread to exit, cleans upafter it, and returns any data the thread may have produced.  But whatif you're not interested in the thread's return values, and you don'treally care when the thread finishes? All you want is for the threadto get cleaned up after when it's done.In this case, you use the C<detach()> method.  Once a thread is detached,it'll run until it's finished; then Perl will clean up after itautomatically.    use threads;    my $thr = threads->create(\&sub1);   # Spawn the thread

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -