2015-09-21 20 views
5

Oracle Pro Cプリコンパイラを使用するマルチスレッド(posixスレッドまたはpthreadベース)Cアプリケーションがあります。アプリケーションはグローバルなsqlca構造体を使用します。 1つの.cファイルでは、それは、OracleデータベースにアクセスするためのグローバルSQLCA構造体の定義が含まれています。次のようにOracleデータベースアクセス用のスレッドセーフなグローバルsqlca構造体

#include <sqlca.h> 

および他のすべての、Cファイルでは、それは使用しています:

#define SQLCA_STORAGE_CLASS extern 
    #include <sqlca.h> 

私の質問は、より多くの場合あり1つのスレッドがクエリ、挿入、更新のためにデータベーステーブルにアクセスしようとしていて、グローバルなsqlcaオブジェクトを使用している場合、どうやって相互排除を保証するのですか? また、私は対挿入/更新をクエリするとき、彼らはすべてsqlca構造体を使用していますか?

答えて

1

mutexオブジェクトを取得するグローバル関数と、mutexオブジェクトを返すグローバル関数を持つことができます。

データベースを使用する必要があるスレッドは、ミューテックスを取得する関数を呼び出そうとします。ミューテックスがすでに使用されている場合、関数は0を返します。ミューテックスが使用可能な場合、グラブミューテックス関数はミューテックスを使用不可としてマークし、成功の場合は1を返します。

mutexを正常に取得したスレッドがreturn mutex関数を呼び出すまで、その後のgrab mutexの呼び出しは失敗します。

ミューテックスを取得しようとするスレッドは、ミューテックスが正常にグラブされるまでループに入れられます(つまり、スレッドはミューテックスを待つ)。ここでタイムアウトを設定することもできます。

mutexオブジェクトは、boolと同じくらい単純なものでも、他のより複雑なmutex(windows.hにはmutexオブジェクトがあります)を使用することもできます。

独自のミューテックスを作成する場合は、それが揮発性であることが非常に重要です。

ミューテックスを所有していないスレッドは、データベースにアクセスできません。

関連する問題