私はlock()、unlock()、query1()、query2()、query3()の各関数を持っています。クエリ関数はデータベース上でいくつかのクエリを実行するだけで、それに対するr/wアクセスと考えることができます。彼らはロックしていません。私のシステムはマルチスレッド化されています。データベーストランザクションとスレッド
スレッドp1からlock()が呼び出された場合、スレッドp1からのクエリのみが実行され、他のすべてのスレッドからのクエリはロック解除を待機します。これはどうすればいいですか?
私はpthreadsをCから使用しています。これを行うには、スレッドはロックを保持していることを知っている必要があります。しかし、pthreadsはそのような機能を持っていません。
デザインが間違っていますか?
編集:私は(ロックで欲しい
Function1(){
lock();
query1();
query2();
doQuery3();
unlock();
}
doQuery3(){
lock();
query3();
unlock();
}
行動)は、スレッドが既にロックを保持している場合、それはロックを待つべきではないということです。それはただ実行する必要があります。事は私のlock()関数が実際にトランザクションを開始することです。私はトランザクションでたくさんのものを実行したい。 unlock()はトランザクションを終了します。私はクエリを連鎖できるようにしたい。回避策の1つは、doQuery3()の代わりにFunction1()でquery3()を呼び出すことです。これは、すべての関数に2つのバージョンがあり、1つはロックと1つのバニラクエリを持つことを意味します。
これらのロックとロック解除の機能は、ミューテックスロックであっても、そうでなくてもかまいません。私はpthread mutexで実装しようとしましたが、できませんでした。同じスレッド上のpthread_mutex_lockがブロックするため!クールなトリック?
これをよりうまく実装する方法については、さらに詳しい情報が必要です。このロック戦略で何を達成しようとしていますか? – Schwern
私はあなたがPTHREAD_MUTEX_RECURSIVEをして、スレッドが同じロックを2回以上取得できるようにしたいと思う。 – ChrisW