工人MPM下mod_perl中的进程内协调

工人MPM下mod_perl中的进程内协调,第1张

概述我需要在mod_perl中做一些简单的时区计算. DateTime不是一个选项.我需要做的是通过设置$ENV {TZ}并使用localtime和POSIX :: mktime轻松完成,但在线程MPM下,我需要确保一次只有一个线程与环境混淆. (我不关心本地时间的其他用途等) 如何使用互斥锁或其他锁定策略来序列化(在非编组意义上)对环境的访问?我看过的docs不能很好地解释如何为这个用途创建一个互斥 我需要在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()应该在一个de tor中发生,除了一次性黑客攻击.

更新:请注意,在子例程中如何初始化$mutex存在竞争条件(两个线程几乎可以同时第一次调用this()).您很可能希望在创建(附加)线程之前初始化$mutex,但我不清楚’worker’Apache MPM的详细信息以及如何轻松实现这一点.如果有一些代码“早期”运行,只需从那里调用那个()就可以消除竞争.

这都表明APR :: ThreadMutex的界面更安全:

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

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

总结

以上是内存溢出为你收集整理的工人MPM下mod_perl中的进程协调全部内容,希望文章能够帮你解决工人MPM下mod_perl中的进程内协调所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1213457.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存