首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中向线程添加项::Queue给了我错误“锁只能用于共享值”

在Perl中向线程添加项::Queue给了我错误“锁只能用于共享值”
EN

Stack Overflow用户
提问于 2013-11-20 19:17:30
回答 1查看 252关注 0票数 0

我有一个进程,它访问$taskobj,它有一个Thread::Queue队列,并启动子线程。在分叉之前访问$taskobj没有问题,但在子线程分叉之后,我尝试在$taskobj中调用队列对象上的enqueue。这给了我一个错误

锁只能用于共享值。

Task.pm

代码语言:javascript
复制
sub new {
  my $class = shift;
  my $self;
  $self->{ID} = 0;
  my $taskqueue = Thread::Queue->new();
  $self->{TaskQ} = $taskqueue;
}

sub queueing {
  my $self = shift;
  my $id = $self->{ID};
  my $que = $self->{TaskQ};

  $que->enqueue($id); # getting error here after forking

  $self->{ID} += 1;
  return $id;
}

父进程

代码语言:javascript
复制
sub initializethreads {
  my taskobj = new task();
  taskobj -> queueing();
}

子进程

代码语言:javascript
复制
use Parallel::ForkManager;

my $paralellprocess = new Parallel::ForkManager();

sub initializethreads {
  my taskobj = new task();
  $taskobj->queueing; # error
}
EN

回答 1

Stack Overflow用户

发布于 2013-11-20 20:05:27

你似乎变得很困惑。forkthreads是不同的东西,Thread::QueueParallel::ForkManager都已就位。这是一个非常坏的想法,使用这两个,除非你绝对需要。

要正确工作,必须在所有需要访问队列的线程之间共享Thread::Queue对象。您不会显示您正在使用Parallel::ForkManager做什么,但是如果您分出一个次要进程,然后$que将不再在主进程和分叉进程之间共享,除非您做出了使用forks::shared共享它的特殊安排。

由于Parallel::ForkManager已经在使用threads::shared在线程之间共享队列,所以最终会导致程序的混乱,这是非常不可能工作的。

因为您需要共享数据,所以我建议您坚持使用threadsThread::Queue,忘记分叉。如果您愿意,可以尝试使用fork,但不能同时使用两者。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20104927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档