Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16673
  • 博文数量: 8
  • 博客积分: 843
  • 博客等级: 准尉
  • 技术积分: 91
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-02 13:20
文章分类
文章存档

2010年(8)

我的朋友

分类:

2010-07-04 11:56:48

Perl 线程的历史
  5005threads 线程模型。Perl 对线程的支持最早可以追溯到 1998 年 7 月发布的 Perl v5.005。其发布申明指出,Perl v5.005 中加入了对操作系统级线程的支持,这个新特性是一个实验性的产品,这也就是我们现在所称的 5005threads 线程模型。对于 5005threads 线程模型来说,默认情况下,所有数据结构都是共享的,所以用户必须负责这些共享数据结构的同步访问。如今 5005threads 已经不再被推荐实用,Perl v5.10 以后的版本里,也将不会再支持 5005threads 线程模型。
  ithreads 线程模型。2000 年 5 月发布的 Perl v5.6.0 中开始引入了一个全新的线程模型,即 interpreter threads, 或称为 ithreads,也正是在这个版本的发布申明中第一次提出了 5005threads 线程模型将来可能会被禁用的问题。尽管如此,ithreads 在那个时候还是一个新的实验性的线程模型,用户并不能直接使用它,唯一的办法是通过 fork 函数模拟。经过两年时间的发展,到 2002 年 7 月,Perl v5.8.0 正式发布,这时 ithreads 已经是一个相对成熟的线程模型,发布申明中也鼓励用户从老的 5005threads 线程模型转换到新的 ithreads 线程模型,并明确指出 5005threads 线程模型最终将被淘汰。

ithreads 的特点
  在 ithreads 线程模型中,最与众不同的特点就在于默认情况一切数据结构都不是共享的。每线程复制一份单独的解释器实例、模块、变量。在线程之间共享数据的方法是使用 threads::shared 模块。这个解决方案,虽然占用内存较多但可用,不需要全局解释器锁,在目前普遍的多核环境下,能充分利用处理器资源。但是,仍然有一部分 Perl 模块不是线程安全的需要特殊处理,其中就包括常用的Win32::OLE,本文主要提出在 ithreads 下使用 Win32::OLE 的办法,其它非线程安全的模块,也可参照这个方法。

How To ...
  首先,在线程中单独的引入 Win32::OLE 。然后,在线程退出之前加上 Win32::OLE->Uninitialize() 。

#!/bin/env perl


# threads_ole.pl

# appleii

# 2010.07.04


use strict;
use warnings;
use threads;

sub fetch
{
    require Win32::OLE; import Win32::OLE;
    my $http = Win32::OLE->new('WinHttp.WinHttpRequest.5.1');
    $http->Open("GET", "");
    $http->Send();
    my $content = $http->{ResponseBody};
    print $content;

    Win32::OLE->Uninitialize();
}

my $t = threads->create(\&fetch);
my $t2 = threads->create(\&fetch);
$t->join();
$t2->join();

参考:


阅读(545) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~