2017-06-08 5 views
-1

に予想通り、私はミューテックスの使用法(旧大学コースによって与えられた唯一の弱い理論的知識)に非常に新しいです動作しません。私はdbアクセスに関する問題に取り組んでいます。C++のpthread_mutexは、DBアクセス

データベース(sqlite3データベース)にアクセスするA、B、Cと呼ばれる異なるエンティティ(それぞれ異なるスレッドで生成された)が存在しますが、 DB_Managerと呼ばれるシングルトンクラス(すべての関数を管理する集中クラスを持つ)を介した読み取り/書き込みが可能です。 私はカスタムhwで動作するソフトウェアを開発しているため、C++ 11(デフォルトではシングルトンパターンはスレッドセーフであることがわかっています)を使用することはできません。私の問題は、私は、私はgetterメソッドで、DB_Managerクラスのメンバ変数としてミューテックスを宣言した3つのエンティティA、BとCの間

を同時実行を避けることができないということです。 A、BおよびCからは、コードのクリティカル領域が来る時はいつでも、私はこのような何かをやる:

lock_db=DB_Manager->getMutex(); 

while(pthread_mutex_lock(lock_db) < 0) 
{ 
    //loop in order to wait the release of the mutex because has being locked by someone else 
     } 
//here, the mutex has been succesfully locked 

//HERE RESIDE THE CRITICAL PART OF CODE 

pthread_mutex_unlock(lock_db); //release the mutex 

この動作は、両方のA、BおよびCエンティティのコードの各重要な部分に複製されます。一度実行している

、それぞれが1間のループ(私はしばらくの間ループ内のログのプリントを配置したので、私はこれを知っている)し、すべてがブロックされません。私は何が起こっているのか分からない。私はウェブ上にあるすべての可能性を試しました。

私は何かが足りないことができるよう、私は並行プログラミングに新しいですことを認めます。

+0

C++標準スレッドAPIを使用します。 –

+0

私はそれを使用することはできません。 –

+0

https://blog.codinghorror.com/the-first-rule-of-programming-its-always-your-fault/ –

答えて

1

@nosにより示唆されるように、私は、ミューテックスロックの上にしばらく除去し、単純にすべてOK消えて! 初心者のエラー...しかし、幸いにも修正! ありがとうございます@nos!

関連する問題