2012-04-19 9 views
1

シナリオを描くと、SAPにメッセージを書き込む(RFCを呼び出す)Cで書かれたADAPTERがあります。C - 接続ハンドルへのアクセスを同期する方法

アダプターは、新しいメッセージが「エンジン」に到着したときにのみ呼び出されるため、最大で1日以上の活動がない期間を持つことができます。これは問題が発生する場所で、接続ハンドルはSTANDARDコードの「低レベルソケット」レイヤーで無効になります。または、SAP自体の「無効なハンドルを強制終了」と言う可能性のあるSAPパラメータによって無効になります。

So私が今行っているのは、「アダプターの上に座っている」スレッドと10秒ごとにPING SAPというスレッドです。ここでの問題は、PING/HEARTBEATメッセージと同様に、SAPにメッセージを送信するためにSAME接続ハンドルを使用していることです。

SAPはRFCハンドルのために言う:

AN RFCハンドルは、複数のスレッドで使用できますが、一度に1つのスレッドでアクティブにできる1で作成されたRFC接続のRFCハンドル、。スレッドは 別のスレッドで使用することができますが、これらのスレッドは、このハンドルへのアクセスを同期する必要があります。

しかし、今私が使って試してみました 『この作品を作るためには、pthread_mutex_lock』などが、それはしません。

私は1 GLOBAL "ハンドル" を持っている、と私のアダプタSHARED LIBの起動時に、私は次のようなスレッドを起動:

RC =のpthread_create(& heartbeatThread、NULL、heartbeatThreadMainLoop、(void *型)NULL)を。

このスレッドは10秒ごとにPING SAPするだけです。

完璧な世界では、ここではSAPへのメッセージングを優先させたいので、PINGは静かになるまで待ってからもう一度起動する必要があります。

私のようなリンクを見てきました:

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SYNCHRONIZATION

しかし、私は、メッセージがSAPに起こっている場合はPINGのスレッドが待機しなければならないと述べたように、私は実際には、コードのセクション全体をロック/アンロックしたいです... PINGスレッドがビジー状態の場合は、何とか中断して「やあ、メッセージングの接続ハンドルが必要だ」と言いたいのですが...

このためのベストプラクティスは何ですか?

とヘルプは非常全体のアーキテクチャは、アダプタの範囲を増やすことで簡略化することができ

リントン

+0

'pthread_mutex_lock'を使ってコードを表示してください。 –

答えて

0

おかげでいただければ幸いです。

要求を無期限に待っているメインループの代わりに、10秒後にタイムアウトさせてください。タイムアウトした場合は、起床ロジックを実行します。いずれの場合も(要求またはタイムアウト)、タイマーをリセットします。

これは、共有の全体的な問題を回避し、SAPとのすべてのやりとりをADAPTERに任せます。

関連する問題