multithreading - 区分一个子调用和另一个

标签 multithreading perl

在下面的片段中,如何区分我的子 foo 的第二个调用实例从一开始?

while ($whatever) {
  foo(); foo();     # foo() and foo() have the same caller package, file, and line
}

有点像 super -caller()返回的文件、行和列可以解决问题。我不想使用源过滤器。

背景,或者,这不是一个 XY 问题吗?

我有一个便利模块 Local::Thread::Once,它公开了像 pthread_once 这样的功能。/std::call_once以面向对象的方式,也作为子程序属性。这些都很容易,因为在任何一种情况下都有一个自然且明确的“once_control”或“once_flag”。

但是,还有一个程序接口(interface) — once { ... } — 目前基于 $filename 进行序列化和 $line caller 返回.像这样的东西:
sub once(&) {
  my $user_routine = shift;
  my (undef, $file, $line) = caller;

  my $once_control = get_a_shared_flag_just_for_this_invocation($file, $line);

  lock($once_control);
  if (! $once_control) { $once_control++; $user_routine->(); }
  return;
}

这并不是它的工作原理——真正的效率更高——但重点是调用是从调用者的文件和行中分离出来的。这有效,只是它无法区分同一行上的两个调用。
while ($whatever) {
  once { foo(); }
  once { bar(); }                    # OK, foo() and bar() each called only once
  once { baz(); }; once { buz(); };  # :(  buz() not called, not even once
}

注意$user_routine的地址不能用作附加判别式,因为 subs 是从一个 ithread 复制到另一个 ithread。

我可以忍受这个问题作为一个非常人为的用例的记录限制,但我更愿意以某种方式修复它。

最佳答案

Devel::Callsite正是为此目的而编写的。

关于multithreading - 区分一个子调用和另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494705/

相关文章:

java - 独立JBOSS7使用更多JVMS?

perl - 为什么 2==4 不返回 false?

python - 如何在 Python 中对特定函数的一个实例进行多线程/多处理?

multithreading - 在进行异步I/O时,内核如何判断I/O操作是否完成?

java - 检查线程关闭并在关闭后执行任务

Perl - 如何使用元素数组作为键创建动态多级哈希

regex - 有没有更好的方法来删除 perl 中字符串数组的字符串?

c# - 同时调用 ASP.NET 托管的 WCF 服务时出现 Entity Framework 错误

bash - 在交互式 bash shell 下运行系统命令

arrays - 从数组创建散列的多维键?