(重複我說了在PerlMonks ...)
BEGIN {
my $mutex;
sub that {
$mutex ||= APR::ThreadMutex->new($r->pool());
$mutex->lock();
$ENV{TZ}= ...;
...
$mutex->unlock();
}
}
但是,當然,鎖定()應該在c'tor發生和unlock()應該在除了一次性黑客攻擊之外發生。
更新:請注意,在子程序中如何初始化$ mutex存在爭用條件(兩個線程幾乎可以同時首次調用那個())。你很可能想在創建線程之前初始化$ mutex,但我不清楚'worker'Apache MPM的細節以及你如何輕鬆完成。如果有一些代碼「早」運行,只需從那裏調用()就可以消除競爭。
這一切都表明一個更安全的接口APR :: ThreadMutex:
BEGIN {
my $mutex;
sub that {
my $autoLock= APR::ThreadMutex->autoLock(\$mutex);
...
# Mutex automatically released when $autoLock destroyed
}
}
注意,自動鎖定()獲取到民主基金的引用會導致它使用一個互斥體,以防止種族初始化時$互斥。
來源
2008-09-24 05:18:54
tye
的Apache 2提供了多個分叉/線程模型稱爲MPM的。我正在使用worker MPM,該進程使用多個進程和多個線程。像Apache 1那樣工作的MPM被稱爲prefork。 – ysth 2008-09-24 03:24:23