我有一个进程,它访问$taskobj,它有一个Thread::Queue队列,并启动子线程。在分叉之前访问$taskobj没有问题,但在子线程分叉之后,我尝试在$taskobj中调用队列对象上的enqueue。这给了我一个错误
锁只能用于共享值。
Task.pm
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;
}父进程
sub initializethreads {
my taskobj = new task();
taskobj -> queueing();
}子进程
use Parallel::ForkManager;
my $paralellprocess = new Parallel::ForkManager();
sub initializethreads {
my taskobj = new task();
$taskobj->queueing; # error
}发布于 2013-11-20 20:05:27
你似乎变得很困惑。fork和threads是不同的东西,Thread::Queue和Parallel::ForkManager都已就位。这是一个非常坏的想法,使用这两个,除非你绝对需要。
要正确工作,必须在所有需要访问队列的线程之间共享Thread::Queue对象。您不会显示您正在使用Parallel::ForkManager做什么,但是如果您分出一个次要进程,然后$que将不再在主进程和分叉进程之间共享,除非您做出了使用forks::shared共享它的特殊安排。
由于Parallel::ForkManager已经在使用threads::shared在线程之间共享队列,所以最终会导致程序的混乱,这是非常不可能工作的。
因为您需要共享数据,所以我建议您坚持使用threads和Thread::Queue,忘记分叉。如果您愿意,可以尝试使用fork,但不能同时使用两者。
https://stackoverflow.com/questions/20104927
复制相似问题