2011-07-12 16 views
-1

私は、アプリケーションスコープのシングルトンを持つ可能性のある競合状態を持っています。しかし、私は、これが問題ではないことを、関数レベルの変数を定義することによって考えていました。可変スコープシングルトンの可能な競合状態ですか?

<!--- Calling page ---> 
<cfset url.UUID = createUUID() /> 
<cfset application.UUIDBot.displayUUID() /> 


<!--- UUIDbot ---> 
<cfcomponent> 

    <cffunction name="displayUUID"> 

     <cfset var rc = {} /> 
     <cfset rc.position = url.uuid /> 
     <cfinclude template="displayUUID.cfm" /> 

    </cffunction> 
</cfcomponent> 

<!--- displayUUID.cfm ---> 
<cfoutput>#rc.position#</cfoutput> 

displayUUID.cfmがURLにUUIDを表示しない可能性はありますか?

+0

あなたは何をしようとしていますか? – Henry

+0

関数レベルの変数が適切にスコープされていても、アプリケーションスコープのシングルトンで競合状態が発生する可能性があるかどうかを確認しようとしています。 –

+0

URL変数を扱うコンポーネントをいくつか用意して、カプセル化を破っています。必要な情報を渡すのはなぜですか? 'application.UUIDBot.displayUUID(url.UUID)' – ale

答えて

1

問題は共有していないコード、つまりdisplayUUID.cfmファイルに含まれているコードにあります。 displayUUID内のコードはスレッドセーフではありません(私は推測しています)。このコードでは、変数をローカライズするために "var"を使用する必要があります。それらが地元に掃除されていることを確認する。

ボトムライン: cfincludeを関数内で使用する場合、インクルードされたコードもスレッドセーフでなければなりません。

+0

cfinclude内のすべてのコードがrcでスコープされる場合はどうなりますか?それは安全でしょう、そうですか? –

+0

正解、Jason。この場合、すべてを "rc"で始めると、インクルード内のすべてのvarsをローカルにスコープさせることができます。 –

+0

はい。今はすべてうまく動いているようです。私たちは何の問題もなくいくつかのクロールをしました。本当にありがとう。ボトムラインは最終ラインでした。スレッドセーフです。 –

1

投稿した内容は、スレッドセーフです。構造体によるスレッドの安全性の問題は、以前はnullのポインティングされたメモリの割り当てに発生します。すでに有効なアドレススペースを持っている組み込みのURLスコープ/構造体を使用しているので、これは問題ではありません。

ただし、ロジックおよび手順の実行タイミングに問題がある可能性があります。

私はあなたがここにいるものの推論とデザインに疑問を抱いています。それは赤い旗をたくさん上げる。

cfinclude?どうして?私はあなたが動的なインクルードの厄介な道を下っていくのを恐れている。

+0

このコードは、この文脈でrcが実際にスレッドセーフであることを検証するための実験に過ぎません。私は競争条件を確認できず、競合状態を再現できませんでした。これは実際のコードではなく、 "UUIDbot"がモデル/コントローラーのリード突然変異体コンボである単純なMVCコードの非常に単純化された突然変異表現です。 –

関連する問題