<<=========================threads===========================>>
#!/usr/bin/perl
|
use threads ( 'yield' ,
|
'stack_size' => 64*4096,
|
=>
'threads_only'
'stringify'
);
sub start_thread {
|
my
@args
=
@_
;
print ( 'Thread started: ' join ' ' @args ), "\n" |
##创建线程的方法
# my $thr = threads->create('func_name',...); |
# my $thr = threads->create(\&func,0)!important"># The "->new()" method is an alias for "->create()". |
$thr = threads->create( 'start_thread' 'argument1' 'argument2' ); #通过create创建线程。返回线程实例
|
$thr
->
();
#等待线程结束
threads->create({ "I am a thread\n" ); })-> (); #创建一个线程,没有返回值。那这个线程实例如何访问呢?
|
= async {
foreach
(
@ARGS
) {
print
"$_\n"
; } };
#通过async使用匿名子例程创建线程
();
if ( $err ->error()) {
|
"Thread error: $err\n"
);
} |
= threads->create(
{
return
(qw/a b c/); });
# 在显式的列表环境中调用thread |
= threads->create({
'context'
'list'
},monospace!important; font-size:1em!important; min-height:inherit!important">
(qw/a b c/); });
@results $thr3 ();
|
print
"@results\n"
# 把线程从主线程中分离出来
$thr4->detach(); ##
|
->tid();
"线程4ID:$tid\n";
|
= threads->self();
$thr7 = threads->object( $tid # Get a thread's ID
|
= "$thr7" ; #根据线程实例获得线程ID
|
yield(); |
= threads->list();
$thread_count = threads->list();
|
= threads->list(threads::running);
= threads->list(threads::joinable);
# 判断两个线程是相同 |
== ) {
|
# 管理线程栈大小
= threads->get_stack_size();
$old_size = threads->set_stack_size(32*4096);
|
= threads->create({
'context'
=> 32*4096,monospace!important; font-size:1em!important; min-height:inherit!important; color:blue!important">'exit'
'thread_only'
\&start_thread);
->
wantarray
print
$wantarray
# Check thread's state
->is_running()) {
sleep(1);
|
# Send a signal to a thread
'SIGUSR1'
# Exit a thread
threads->exit ();
|
<<=========================Thread========================>>
$thread = Thread->new(\&start_sub)
$thread = Thread->new(\&start_sub,@args)
start_sub指定线程要执行的子例程,args是传给子例程的参数。
lock VARIABLE
给变量加锁,直到锁超出范围。 给变量加锁只影响到lock函数的调用--即一个线程lock var1后,另一个线程再调用lovk var1时线程就会阻塞,但 lock VARIABLE并不影响正常的对变量的访问。
如果锁往的是一个容器(如哈希或数组),那么其中的每一个元素并没有全部被锁住。比如一个线程中调用lock @arr,在另一个线程中调用lock $arr[3]时并不会阻塞。
async BLOCK;
async函数创建并返回一个线程实例,该线程要执行的代码全在BLOCK中,这里BLOCK是个匿名子例程,所以其后一定加分号。
Thread->self
Thread->list
返回non-joined和non-detached线程实例。
cond_wait LOCKED_VARIALBLE
cond_signal LOCKED_VARIALBLE
cond_broadcast LOCKED_VARIALBLE
上面3个函数主要用于线程问同步,都以一个已加锁的变量作为输入参数。当一个线程调用cond_wait后阻塞自己;当一个线程发出cond_broadcast后所有阻塞的线程得救;当一个线程发出 cond_signal后只有一个阻塞的线程得救,至于是哪一个由系统内部决定。当然只有 LOCKED_VARIALBLE参数相同时才为一组,大家才可以在一起玩同步。
yield
把cpu控制权交给另外一个线程,至于是哪个线程依赖于当时的运行环境。
join
等待一个线程结束并返回该线程结束时的返回值。
detach
分离的线程不允许被join。
equal
判断两个线程是否相同。
tid
返回线程的tid。tid是递增的,main线程的tid为0。
done
判断线程是否已经结束。
下面这3个函数在5005threads中还可以用,但是在ithreads中已经不可用了。
lock(\&sub) eval flags
<<============================threads::shared============================>>
默认下数据都是线程私有的,新创建的线程获得已有变量的一份私有拷贝。 threads::shared用于在线程之间共享数据结构,可共享的数据类型只有6种,标量数据、数组、散列、以及它们的引用。
声明共享变量:
my ($scalar,@array,%hash);
share($scalar);
share(@array);
share(%hash);
share函数返回共享的值,这通常是一个引用。
也可以在编译时标记变量为共享变量:
my ($var,%hash,@array) :shared;
$var
%hash
@array
) :shared;
$bork
# Storing scalars
$var = 1;
|
{
'foo'
} =
'bar'
$array
[0] = 1.5;
# $var = \$bork; # ref of non-shared variable |
# push(@array,{ 'x' => 1 }); # non-shared hash ref |