0

関数 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 がブロックするためです。クールなトリックはありますか??

4

4 に答える 4

2

はい、あなたのデザインは間違っています。

ロックはデータベースで行われている必要があります。

于 2009-06-14T03:06:05.310 に答える
1

あなたの質問/デザインを理解できたかどうかはわかりませんが...

必要な機能は次のとおりです。スレッド p1 から lock() が呼び出された場合、スレッド p1 からのクエリのみが実行され、他のすべてのスレッドからのクエリはロック解除を待ちます。どうすればいいですか?

p1スレッドが呼び出す作業単位がこんな感じなら……

void doQuery1()
{
  //get the lock
  //if someone else has the lock, block until it's released
  lock();

  //now we have the lock
  //do query
  query1();

  //our work is done
  //release the lock, let another thread run
  unlock();
}

...そして、他のスレッドによって呼び出される作業は似ています...

void doQuery2()
{
  lock();
  query2();
  unlock();
}

void doQuery3()
{
  lock();
  query3();
  unlock();
}

...次に、p1にロックがある場合、他のスレッドもクエリを試みる前に常にロック関数を呼び出し、ロック関数がロック解除を待機するため、それがあなたの質問に対する答えだと思います:結果はクエリです他のスレッドからのロック解除を待機します (つまり、すべてのスレッドが常にロックを呼び出し、ロックがロック解除を待機するため)。

于 2009-06-14T03:34:49.233 に答える
0
  • データベースがロックを処理している場合。SQL データベースの場合、トランザクションは明示的に、または最初の SQL ステートメントで開始され、コミット作業で終了します。共有データを使用している場合は、プログラムを同期する (例: キューを使用する) だけで済みます。

  • データベースがロックを処理していない場合は、次のようにロックを使用する必要があります。

    START_TRANSACTION = pthread_mutex_lock

    END_TRANSACTION = pthread_mutex_unlock

ただし、ロールバック処理はなく、不整合に対する保護もありません。

于 2009-06-14T08:13:41.343 に答える