関数 lock()、unlock()、query1()、query2()、および query3() があります。クエリ関数は、データベースに対して何らかのクエリを実行するだけで、データベースへの r/w アクセスと見なすことができます。ロックしません。私のシステムはマルチスレッドです。
必要な機能は次のとおりです。スレッド p1 から lock() が呼び出された場合、スレッド p1 からのクエリのみが実行され、他のすべてのスレッドからのクエリはロック解除を待ちます。どうすればいいですか?
私は C の pthreads を使用しています。これを行うには、スレッドがロックを保持していることを認識している必要があります。しかし、pthreads にはそのような機能はありません。
設計がおかしい??
編集:
Function1(){
lock();
query1();
query2();
doQuery3();
unlock();
}
doQuery3(){
lock();
query3();
unlock();
}
lock() で必要な動作は、スレッドが既にそのロックを保持している場合、ロックを待機しないことです。実行するだけです。問題は、私の lock() 関数が実際にトランザクションを開始することです。トランザクションでたくさんのものを実行したい。そして unlock() はトランザクションを終了します。クエリを連鎖できるようにしたい。1 つの回避策は、doQuery3() の代わりに Function1() で query3() を呼び出すことです。つまり、すべての関数に 2 つのバージョンがあり、1 つはロック付きで、もう 1 つはバニラ query() です。
繰り返しますが、これらのロックおよびロック解除機能は、mutex ロックである場合とそうでない場合があります。pthreadミューテックスで実装しようとしましたが、できませんでした。同じスレッドの pthread_mutex_lock がブロックするためです。クールなトリックはありますか??