2012-11-27 9 views
7

私は、perl 5.16(および他のバージョン)をfreebsdのポートソースからコンパイルすると、 'THREADS'と 'PTHREAD'の間に何が違うのだろうか?スレッド対pthread in perl

PTHREADはポスキースレッドですか? (-pthreadのため)そしてもしそうなら、それは 'スレッド'に優先されますか? (それはあらかじめ選択されているようだから)freebsdでも?一方、「スレッド」(カーネルスレッド?)は何ですか?長所と短所は何ですか?

1回のインストールで両方を使用できますか?それは感覚的ですか?

私が見る限りでは、perlと組み合わせて探すのはあまりありません。他の人はもちろん、それを説明してきたように、スレッドを使用して

おかげでたくさん ジミー

+0

hum ... Perlにはスレッドモデルが1つしかありません( '-Dusethreads') – ikegami

+0

hmm :) 'THREADS'でコンパイルすると、config引数が-Dusethreads = nから-Dusethreads = yに変更されます。 'PTHREADS'はldflagsに '-pthread'を追加します。だから、冗談だけではないと思います。それは違いがありますが、私は何を疑問に思う? :/ –

+1

Perlは別のモデルのスレッドを使用していました。それは非常に壊れていた。あなたはおそらくそれにアクセスしようとしています。 – ikegami

答えて

17

です。

pthreadとのリンクは、あなたのperlが-pthreadフラグで構築されていることを意味します。これは微妙で重要な効果があります。これは、perlが起動すると、スレッドの状態を保持するlibcデータが初期化されることを意味します。つまり、perlがスレッド化されたライブラリでdlopen()を呼び出すと、ハングするのではなく正しく動作します。

PS。私は実際にポートにPTHREADオプションを書いてコミットした人物です。私は実際にいくつかのperlモジュールを発見しました。いくつかのスレッドライブラリをdlopen()してperlをハングアップさせました。理由を理解するために私をしばらく時間がかかりました。私を信じて、PTHREADオプションをオンにします。私は実際にそれをオフにするオプションを削除することを考えています。詳細については、FreeBSDのPR 163512と163878を参照してください。このオプションを上流にプッシュして、perlがFreeBSDでこれをデフォルトで使用するようにしてください。 dlopen()と呼ばれるものは、実際には-pthreadで構築する必要があります。

+0

私はあなたを愛しています!そして、あなたが言及し、参照したものに関しては、それをデフォルトにすることは良い考えのように思えます。再度、感謝します! –

+0

この説明をありがとうございます。私は、常にpthreadsとリンクさせることを提案しました:https://rt.perl.org/Public/Bug/Display.html?id=122906 –