请考虑以下代码:
for (my $i = 0; $i < $threadCount; $i++) {
if($isResumed) {
# TODO: load stats from DB
}
else {
$stats->{workers}->{$i} = &share({});
$stats->{workers}->{$i}->{tid} = undef;
$stats->{workers}->{$i}->{foo} = "bar";
$stats->{workers}->{$i}->{abc} = 123;
}
# create the worker thread
my $thr = threads->create(\&worker);
# TODO: find a way to store the TID in the $i slot. why have two differetn IDs?
$stats->{workers}->{$i}->{tid} = $thr->tid();
}
我使用$ stats哈希来保存应该在线程之间共享的数据,以及有关每个线程正在做什么的数据。我遇到的问题是我想根据TID引用此哈希中的线程数据,而不是在循环中由$ i分配的任意值。
当我创建线程时,工作立即开始,但在设置哈希值之前无法开始工作。所以,如果我这样做:
$thr = threads->create(\&worker);
$stats->{workers}->{$thr->tid()} = &share({});
它不起作用,因为它还没有设置所需的所有数据。
所以基本上,有没有办法让我创建一个线程,但推迟它运行其代码,直到我具体告诉它?类似的东西:
$thr = threads->create(\&worker);
$stats->{workers}->{$thr->tid()} = &share({});
$thr->start();
答案 0 :(得分:4)
强烈建议您使用Thread::Queue这样的内容
答案 1 :(得分:0)
最后,在审查我的代码之后;我意识到我让它变得复杂,并且真的不需要知道TID。
我最终只是在create语句中将相关数据传递给worker子例程。
尽管如此,遇到这个问题的人应该看一下Jean的答案,因为它似乎是解决我原来问题的有希望的解决方案。