gpt4 book ai didi

perl - worker MPM 下 mod_perl 中的进程内协调

转载 作者:行者123 更新时间:2023-12-01 10:16:51 25 4
gpt4 key购买 nike

我需要在 mod_perl 中做一些简单的时区计算。 DateTime 不是一个选项。我需要做的是通过设置 $ENV{TZ} 并使用 localtime 和 POSIX::mktime 轻松完成,但是在线程 MPM 下,我需要确保一次只有一个线程在处理环境。 (我不关心本地时间等的其他用途)

如何使用互斥锁或其他锁定策略来序列化(在非编码意义上)对环境的访问? docs我看过并没有很好地解释我将如何为这种用途创建互斥体。关于通常如何创建互斥锁,也许有些事情我只是没有得到。

更新:是的,我知道需要使用 Env::C 来设置 TZ。

最佳答案

(重复我在 PerlMonks 说过的话……)

BEGIN {
my $mutex;

sub that {
$mutex ||= APR::ThreadMutex->new( $r->pool() );
$mutex->lock();

$ENV{TZ}= ...;
...

$mutex->unlock();
}
}

但是,当然,lock() 应该发生在 c'tor 中,unlock() 应该发生在 d'tor 中,一次性 hack 除外。

更新:请注意,$mutex 在子例程中的初始化方式存在竞争条件(两个线程几乎同时第一次调用 that())。您很可能希望在创建(其他)线程之前初始化 $mutex,但我不清楚“worker”Apache MPM 的详细信息以及您如何轻松完成此操作。如果有一些代码“提前”运行,只需从那里调用 that() 即可消除竞争。

所有这些都表明 APR::ThreadMutex 有一个更安全的接口(interface):

BEGIN {
my $mutex;

sub that {
my $autoLock= APR::ThreadMutex->autoLock( \$mutex );
...
# Mutex automatically released when $autoLock destroyed
}
}

请注意,autoLock() 获取对 undef 的引用会导致它在初始化 $mutex 时使用互斥锁来防止竞争。

关于perl - worker MPM 下 mod_perl 中的进程内协调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com