plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

thread.3 (15472B)


      1 .TH THREAD 3
      2 .SH NAME
      3 alt,
      4 chancreate,
      5 chanfree,
      6 chanprint,
      7 chansetname,
      8 mainstacksize,
      9 proccreate,
     10 procdata,
     11 recv,
     12 recvp,
     13 recvul,
     14 send,
     15 sendp,
     16 sendul,
     17 nbrecv,
     18 nbrecvp,
     19 nbrecvul,
     20 nbsend,
     21 nbsendp,
     22 nbsendul,
     23 threadcreate,
     24 threaddata,
     25 threadexec,
     26 threadexecl,
     27 threadexits,
     28 threadexitsall,
     29 threadgetgrp,
     30 threadgetname,
     31 threadint,
     32 threadintgrp,
     33 threadkill,
     34 threadkillgrp,
     35 threadmain,
     36 threadmaybackground,
     37 threadnotify,
     38 threadid,
     39 threadpid,
     40 threadpin,
     41 threadunpin,
     42 threadsetgrp,
     43 threadsetname,
     44 threadsetstate,
     45 threadspawn,
     46 threadspawnd,
     47 threadspawnl,
     48 threadwaitchan,
     49 yield \- thread and proc management
     50 .SH SYNOPSIS
     51 .PP
     52 .EX
     53 .ta 4n +4n +4n +4n +4n +4n +4n
     54 #include <u.h>
     55 #include <libc.h>
     56 #include <thread.h>
     57 .sp
     58 #define	CHANEND		0
     59 #define	CHANSND		1
     60 #define	CHANRCV		2
     61 #define	CHANNOP		3
     62 #define	CHANNOBLK	4
     63 .sp
     64 .ta \w'    'u +\w'Channel 'u
     65 typedef struct Alt Alt;
     66 struct Alt {
     67 	Channel	*c;
     68 	void	*v;
     69 	int	op;
     70 	Channel	**tag;
     71 	int	entryno;
     72 	char	*name;
     73 };
     74 .fi
     75 .de XX
     76 .if t .sp 0.5
     77 .if n .sp
     78 ..
     79 .PP
     80 .nf
     81 .ft L
     82 .ta \w'\fLChannel* 'u +4n +4n +4n +4n
     83 void	threadmain(int argc, char *argv[])
     84 int	threadmaybackground(void)
     85 int	mainstacksize
     86 int	proccreate(void (*fn)(void*), void *arg, uint stacksize)
     87 int	threadcreate(void (*fn)(void*), void *arg, uint stacksize)
     88 void	threadexits(char *status)
     89 void	threadexitsall(char *status)
     90 void	yield(void)
     91 int	threadpin(void)
     92 int	threadunpin(void)
     93 .XX
     94 int	threadid(void)
     95 int	threadgrp(void)
     96 int	threadsetgrp(int group)
     97 int	threadpid(int id)
     98 .XX
     99 int	threadint(int id)
    100 int	threadintgrp(int group)
    101 int	threadkill(int id)
    102 int	threadkillgrp(int group)
    103 .XX
    104 void	threadsetname(char *name)
    105 char*	threadgetname(void)
    106 .XX
    107 void**	threaddata(void)
    108 void**	procdata(void)
    109 .XX
    110 Channel*	chancreate(int elsize, int nel)
    111 void	chanfree(Channel *c)
    112 .XX
    113 int	alt(Alt *alts)
    114 int	recv(Channel *c, void *v)
    115 void*	recvp(Channel *c)
    116 ulong	recvul(Channel *c)
    117 int	nbrecv(Channel *c, void *v)
    118 void*	nbrecvp(Channel *c)
    119 ulong	nbrecvul(Channel *c)
    120 int	send(Channel *c, void *v)
    121 int	sendp(Channel *c, void *v)
    122 int	sendul(Channel *c, ulong v)
    123 int	nbsend(Channel *c, void *v)
    124 int	nbsendp(Channel *c, void *v)
    125 int	nbsendul(Channel *c, ulong v)
    126 int	chanprint(Channel *c, char *fmt, ...)
    127 .XX
    128 int	threadspawnl(int fd[3], char *file, ...)
    129 int	threadspawn(int fd[3], char *file, char *args[])
    130 int	threadspawnd(int fd[3], char *file, char *args[], char *dir)
    131 int	threadexecl(Channel *cpid, int fd[3], char *file, ...)
    132 int	threadexec(Channel *cpid, int fd[3], char *file, char *args[])
    133 Channel*	threadwaitchan(void)
    134 .XX
    135 int	threadnotify(int (*f)(void*, char*), int in)
    136 .EE
    137 .SH DESCRIPTION
    138 .PP
    139 The thread library provides parallel programming support similar to that
    140 of the languages
    141 Alef and Newsqueak.
    142 Threads
    143 and
    144 procs
    145 occupy a shared address space,
    146 communicating and synchronizing through
    147 .I channels
    148 and shared variables.
    149 .PP
    150 A
    151 .I proc
    152 is a Plan 9 process that contains one or more cooperatively scheduled
    153 .IR threads .
    154 Programs using threads must replace
    155 .I main
    156 by
    157 .IR threadmain .
    158 The thread library provides a
    159 .I main
    160 function that sets up a proc with a single thread executing
    161 .IR threadmain .
    162 .PP
    163 Every thread is backed by an operating system-provided
    164 .I pthread
    165 and runs on its system-provided stack;
    166 .I mainstacksize
    167 and the the stack size arguments to
    168 .I proccreate
    169 and
    170 .I threadcreate
    171 are ignored.
    172 Although each thread is backed by a separate
    173 .IR pthread ,
    174 the threads in a proc are still scheduled non-preemptively
    175 as on Plan 9 and as described below.
    176 .PP
    177 .I Threadcreate
    178 creates a new thread in the calling proc, returning a unique integer
    179 identifying the thread; the thread
    180 executes
    181 .I fn(arg)
    182 on a stack of size
    183 .IR stacksize .
    184 Thread stacks are allocated in shared memory, making it valid to pass
    185 pointers to stack variables between threads and procs.
    186 .I Proccreate
    187 creates a new proc, and inside that proc creates
    188 a single thread as
    189 .I threadcreate
    190 would,
    191 returning the id of the created thread.
    192 .\" .I Procrfork
    193 .\" creates the new proc by calling
    194 .\" .B rfork
    195 .\" (see
    196 .\" .IR fork (3))
    197 .\" with flags
    198 .\" .BR RFPROC|RFMEM|RFNOWAIT| \fIrforkflag\fR.
    199 .\" (The thread library depends on all its procs
    200 .\" running in the same rendezvous group.
    201 .\" Do not include
    202 .\" .B RFREND
    203 .\" in
    204 .\" .IR rforkflag .)
    205 .\" .I Proccreate
    206 .\" is identical to
    207 .\" .I procrfork
    208 .\" with
    209 .\" .I rforkflag
    210 .\" set to zero.
    211 Be aware that the calling thread may continue
    212 execution before
    213 the newly created proc and thread
    214 are scheduled.
    215 Because of this,
    216 .I arg
    217 should not point to data on the stack of a function that could
    218 return before the new process is scheduled.
    219 .PP
    220 .I Threadexits
    221 terminates the calling thread.
    222 If the thread is the last in its proc,
    223 .I threadexits
    224 also terminates the proc, using
    225 .I status
    226 as the exit status.
    227 .I Threadexitsall
    228 terminates all procs in the program,
    229 using
    230 .I status
    231 as the exit status.
    232 .PP
    233 When the last thread in
    234 .IR threadmain 's
    235 proc exits, the program will appear to its parent to have exited.
    236 The remaining procs will still run together, but as a background program.
    237 This functionality can only be relied upon if the program defines a function
    238 .I threadmaybackground
    239 returning a non-zero result.
    240 Programs that do not define such a
    241 .I threadmaybackground
    242 will crash instead should the last thread in
    243 .IR threadmain 's
    244 proc exit leaving behind other running procs.
    245 .PP
    246 The threads in a proc are coroutines, scheduled nonpreemptively
    247 in a round-robin fashion.
    248 A thread must explicitly relinquish control of the processor
    249 before another thread in the same proc is run.
    250 Calls that do this are
    251 .IR yield ,
    252 .IR proccreate ,
    253 .IR threadexec ,
    254 .IR threadexecl ,
    255 .IR threadexits ,
    256 .IR threadspawn ,
    257 .IR threadspawnd ,
    258 .IR threadspawnl ,
    259 .IR alt ,
    260 .IR send ,
    261 and
    262 .I recv
    263 (and the calls related to
    264 .I send
    265 and
    266 .IR recv \(emsee
    267 their descriptions further on).
    268 Procs are scheduled by the operating system.
    269 Therefore, threads in different procs can preempt one another
    270 in arbitrary ways and should synchronize their
    271 actions using
    272 .B qlocks
    273 (see
    274 .MR lock (3) )
    275 or channel communication.
    276 System calls such as
    277 .MR read (3)
    278 block the entire proc;
    279 all threads in a proc block until the system call finishes.
    280 .PP
    281 .I Threadpin
    282 disables scheduling inside a proc, `pinning' the current
    283 thread as the only runnable one in the current proc.
    284 .I Threadunpin
    285 reenables scheduling, allowing other procs to run once the current
    286 thread relinquishes the processor.
    287 .I Threadpin
    288 and
    289 .I threadunpin
    290 can lead to deadlock.
    291 Used carefully, they can make library routines that use
    292 .B qlocks
    293 appear atomic relative to the current proc, like a system call.
    294 .PP
    295 As mentioned above, each thread has a unique integer thread id.
    296 Thread ids are not reused; they are unique across the life of the program.
    297 .I Threadid
    298 returns the id for the current thread.
    299 Each thread also has a thread group id.
    300 The initial thread has a group id of zero.
    301 Each new thread inherits the group id of
    302 the thread that created it.
    303 .I Threadgrp
    304 returns the group id for the current thread;
    305 .I threadsetgrp
    306 sets it.
    307 .I Threadpid
    308 returns the pid of the Plan 9 process containing
    309 the thread identified by
    310 .IR id ,
    311 or \-1
    312 if no such thread is found.
    313 .PP
    314 .I Threadint
    315 interrupts a thread that is blocked in a channel operation
    316 or system call.
    317 .I Threadintgrp
    318 interrupts all threads with the given group id.
    319 .I Threadkill
    320 marks a thread to die when it next relinquishes the processor
    321 (via one of the calls listed above).
    322 If the thread is blocked in a channel operation or system call,
    323 it is also interrupted.
    324 .I Threadkillgrp
    325 kills all threads with the given group id.
    326 Note that
    327 .I threadkill
    328 and
    329 .I threadkillgrp
    330 will not terminate a thread that never relinquishes
    331 the processor.
    332 .PP
    333 Primarily for debugging,
    334 threads can have string names associated with them.
    335 .I Threadgetname
    336 returns the current thread's name;
    337 .I threadsetname
    338 sets it.
    339 The pointer returned by
    340 .I threadgetname
    341 is only valid until the next call to
    342 .IR threadsetname .
    343 .PP
    344 Also for debugging,
    345 threads have a string state associated with them.
    346 .I Threadsetstate
    347 sets the state string.
    348 There is no
    349 .IR threadgetstate ;
    350 since the thread scheduler resets the state to
    351 .B Running
    352 every time it runs the thread,
    353 it is only useful for debuggers to inspect the state.
    354 .PP
    355 .I Threaddata
    356 returns a pointer to a per-thread pointer
    357 that may be modified by threaded programs for
    358 per-thread storage.
    359 Similarly,
    360 .I procdata
    361 returns a pointer to a per-proc pointer.
    362 .PP
    363 .I Threadexecl
    364 and
    365 .I threadexec
    366 are threaded analogues of
    367 .I exec
    368 and
    369 .I execl
    370 (see
    371 .MR exec (3) );
    372 on success,
    373 they replace the calling thread
    374 and invoke the external program, never returning.
    375 (Unlike on Plan 9, the calling thread need not be the only thread in its proc\(emthe other
    376 threads will continue executing.)
    377 On error, they return \-1.
    378 If
    379 .I cpid
    380 is not null, the pid of the invoked program
    381 will be sent along
    382 .I cpid
    383 (using
    384 .IR sendul )
    385 once the program has been started, or \-1 will be sent if an
    386 error occurs.
    387 .I Threadexec
    388 and
    389 .I threadexecl
    390 will not access their arguments after sending a result
    391 along
    392 .IR cpid .
    393 Thus, programs that malloc the
    394 .I argv
    395 passed to
    396 .I threadexec
    397 can safely free it once they have
    398 received the
    399 .I cpid
    400 response.
    401 .PP
    402 .I Threadexecl
    403 and
    404 .I threadexec
    405 will duplicate
    406 (see
    407 .MR dup (3) )
    408 the three file descriptors in
    409 .I fd
    410 onto standard input, output, and error for the external program
    411 and then close them in the calling thread.
    412 Beware of code that sets
    413 .IP
    414 .EX
    415 fd[0] = 0;
    416 fd[1] = 1;
    417 fd[2] = 2;
    418 .EE
    419 .LP
    420 to use the current standard files.  The correct code is
    421 .IP
    422 .EX
    423 fd[0] = dup(0, -1);
    424 fd[1] = dup(1, -1);
    425 fd[2] = dup(2, -1);
    426 .EE
    427 .PP
    428 .I Threadspawnl
    429 and
    430 .I threadspawn
    431 are like
    432 .I threadexecl
    433 and
    434 .I threadexec
    435 but do not replace the current thread.
    436 They return the pid of the invoked program on success, or
    437 \-1 on error.
    438 .I Threadspawnd
    439 is like
    440 .I threadspawn
    441 but takes as its final argument the directory in which to run the invoked program.
    442 The child will attempt to change into that directory before running the program,
    443 but it is only best effort: failure to change into the directory does not
    444 stop the running of the program.
    445 .PP
    446 .I Threadwaitchan
    447 returns a channel of pointers to
    448 .B Waitmsg
    449 structures (see
    450 .MR wait (3) ).
    451 When an exec'ed process exits, a pointer to a
    452 .B Waitmsg
    453 is sent to this channel.
    454 These
    455 .B Waitmsg
    456 structures have been allocated with
    457 .MR malloc (3)
    458 and should be freed after use.
    459 .PP
    460 A
    461 .B Channel
    462 is a buffered or unbuffered queue for fixed-size messages.
    463 Procs and threads
    464 .I send
    465 messages into the channel and
    466 .I recv
    467 messages from the channel.  If the channel is unbuffered, a
    468 .I send
    469 operation blocks until the corresponding
    470 .I recv
    471 operation occurs and
    472 .IR "vice versa" .
    473 .IR Chancreate
    474 allocates a new channel
    475 for messages of size
    476 .I elsize
    477 and with a buffer holding
    478 .I nel
    479 messages.
    480 If
    481 .I nel
    482 is zero, the channel is unbuffered.
    483 .I Chanfree
    484 frees a channel that is no longer used.
    485 .I Chanfree
    486 can be called by either sender or receiver after the last item has been
    487 sent or received.  Freeing the channel will be delayed if there is a thread
    488 blocked on it until that thread unblocks (but
    489 .I chanfree
    490 returns immediately).
    491 .PP
    492 The
    493 .B name
    494 element in the
    495 .B Channel
    496 structure is a description intended for use in debugging.
    497 .I Chansetname
    498 sets the name.
    499 .PP
    500 .I Send
    501 sends the element pointed at by
    502 .I v
    503 to the channel
    504 .IR c .
    505 If
    506 .I v
    507 is null, zeros are sent.
    508 .I Recv
    509 receives an element from
    510 .I c
    511 and stores it in
    512 .IR v .
    513 If
    514 .I v
    515 is null,
    516 the received value is discarded.
    517 .I Send
    518 and
    519 .I recv
    520 return 1 on success, \-1 if interrupted.
    521 .I Nbsend
    522 and
    523 .I nbrecv
    524 behave similarly, but return 0 rather than blocking.
    525 .PP
    526 .IR Sendp ,
    527 .IR nbsendp ,
    528 .IR sendul ,
    529 and
    530 .I nbsendul
    531 send a pointer or an unsigned long; the channel must
    532 have been initialized with the appropriate
    533 .IR elsize .
    534 .IR Recvp ,
    535 .IR nbrecvp ,
    536 .IR recvul ,
    537 and
    538 .I nbrecvul
    539 receive a pointer or an unsigned long;
    540 they return zero when a zero is received,
    541 when interrupted, or
    542 (for
    543 .I nbrecvp
    544 and
    545 .IR nbrecvul )
    546 when the operation would have blocked.
    547 To distinguish between these three cases,
    548 use
    549 .I recv
    550 or
    551 .IR nbrecv .
    552 .PP
    553 .I Alt
    554 can be used to recv from or send to one of a number of channels,
    555 as directed by an array of
    556 .B Alt
    557 structures,
    558 each of which describes a potential send or receive operation.
    559 In an
    560 .B Alt
    561 structure,
    562 .B c
    563 is the channel;
    564 .B v
    565 the value pointer (which may be null); and
    566 .B op
    567 the operation:
    568 .B CHANSND
    569 for a send operation,
    570 .B CHANRECV
    571 for a recv operation;
    572 .B CHANNOP
    573 for no operation
    574 (useful
    575 when
    576 .I alt
    577 is called with a varying set of operations).
    578 The array of
    579 .B Alt
    580 structures is terminated by an entry with
    581 .I op
    582 .B CHANEND
    583 or
    584 .BR CHANNOBLK .
    585 If at least one
    586 .B Alt
    587 structure can proceed, one of them is
    588 chosen at random to be executed.
    589 .I Alt
    590 returns the index of the chosen structure.
    591 If no operations can proceed and the list is terminated with
    592 .BR CHANNOBLK ,
    593 .I alt
    594 returns the index of the terminating
    595 .B CHANNOBLK
    596 structure.
    597 Otherwise,
    598 .I alt
    599 blocks until one of the operations can proceed,
    600 eventually returning the index of the structure executes.
    601 .I Alt
    602 returns \-1 when interrupted.
    603 The
    604 .B tag
    605 and
    606 .B entryno
    607 fields in the
    608 .B Alt
    609 structure are used internally by
    610 .I alt
    611 and need not be initialized.
    612 They are not used between
    613 .I alt
    614 calls.
    615 .PP
    616 .I Chanprint
    617 formats its arguments in the manner of
    618 .MR print (3)
    619 and sends the result to the channel
    620 .IR c.
    621 The string delivered by
    622 .I chanprint
    623 is allocated with
    624 .MR malloc (3)
    625 and should be freed upon receipt.
    626 .PP
    627 Thread library functions do not return on failure;
    628 if errors occur, the entire program is aborted.
    629 .PP
    630 Threaded programs should use
    631 .I threadnotify
    632 in place of
    633 .I atnotify
    634 (see
    635 .MR notify (3) ).
    636 .PP
    637 It is safe to use
    638 .MR sysfatal (3)
    639 in threaded programs.
    640 .I Sysfatal
    641 will print the error string and call
    642 .IR threadexitsall .
    643 .PP
    644 It is not safe to call
    645 .IR rfork
    646 in a threaded program, except to call
    647 .B rfork(RFNOTEG)
    648 from the main proc before any other procs have been created.
    649 To create new processes, use
    650 .IR proccreate .
    651 .\" .PP
    652 .\" It is safe to use
    653 .\" .IR rfork
    654 .\" (see
    655 .\" .IR fork (3))
    656 .\" to manage the namespace, file descriptors, note group, and environment of a
    657 .\" single process.
    658 .\" That is, it is safe to call
    659 .\" .I rfork
    660 .\" with the flags
    661 .\" .BR RFNAMEG ,
    662 .\" .BR RFFDG ,
    663 .\" .BR RFCFDG ,
    664 .\" .BR RFNOTEG ,
    665 .\" .BR RFENVG ,
    666 .\" and
    667 .\" .BR RFCENVG.
    668 .\" (To create new processes, use
    669 .\" .I proccreate
    670 .\" and
    671 .\" .IR procrfork .)
    672 .\" As mentioned above,
    673 .\" the thread library depends on all procs being in the
    674 .\" same rendezvous group; do not change the rendezvous
    675 .\" group with
    676 .\" .IR rfork .
    677 .SH FILES
    678 .B \*9/acid/thread
    679 contains useful
    680 .MR acid (1)
    681 functions for debugging threaded programs.
    682 .PP
    683 .B \*9/src/libthread/test
    684 contains some example programs.
    685 .SH SOURCE
    686 .B \*9/src/libthread
    687 .SH SEE ALSO
    688 .MR intro (3) ,
    689 .MR ioproc (3)
    690 .SH BUGS
    691 To avoid name conflicts,
    692 .IR alt ,
    693 .IR nbrecv ,
    694 .IR nbrecvp ,
    695 .IR nbrecvul ,
    696 .IR nbsend ,
    697 .IR nbsendp ,
    698 .IR nbsendul ,
    699 .IR recv ,
    700 .IR recvp ,
    701 .IR recvul ,
    702 .IR send ,
    703 .IR sendp ,
    704 and
    705 .IR sendul
    706 are defined as macros that expand to
    707 .IR chanalt ,
    708 .IR channbrecv ,
    709 and so on.
    710 .I Yield
    711 is defined as a macro that expands to
    712 .IR threadyield .
    713 See
    714 .MR intro (3) .
    715 .PP
    716 Threadint,
    717 threadintgrp,
    718 threadkill,
    719 threadkillgrp and threadpid are unimplemented.
    720 .PP
    721 The implementation of
    722 .I threadnotify
    723 may not be correct.
    724 .PP
    725 There appears to be a race in the Linux NPTL
    726 implementation of
    727 .I pthread_exit .
    728 Call
    729 .I threadexitsall
    730 rather than coordinating a simultaneous
    731 .I threadexits
    732 among many threads.