2017-05-26 16 views
1

私は3つのクラスを持っています。それらをA、B、およびHardwareDriverと呼びましょう。各クラスには1つのインスタンスがあります。 aとbは2つの異なるスレッドで実行されます。彼らはどちらもHardwareDriverのインスタンスを介してハードウェアにアクセスします。ような何か:pthreadsを使用するクラスメンバーとしてのミューテックス

Class A { 
... }; 

Class B { 
... }; 

Class HardwareDriver { 
    public: 
     int accessHardware(); 
}; 

A a; 
B b; 
HardwareDriver hd; 
pthread_t aThread; 
pthread_t bThread; 

main() { 
    pthread_create(&aThread, NULL, &A::startA, &a); 
    pthread_create(&bThread, NULL, &B::startB, &b); 

    while (...) { }; 
    return 0; 
} 

ハードウェアは、同時に、Bでアクセスすることはできませんので、私はミューテックスを使用してコードを保護する必要があります。私はマルチスレッドに直面していますが、直感的に、メソッドhd.accessHardware()を呼び出すことによってハードウェアアクセスを要求する直前に、AとBのメソッドでmutexをロックします。

今、もっとカプセル化のためにhd.accessHardware()でロックを実行することが可能かどうか疑問に思っています。これはまだスレッドセーフであろうか? C/Cでのマルチスレッドプログラミングを行う場合

+0

&bまたはスレッドは、HardwareDriverの同じオブジェクトを使用していますか?はいの場合は、HardwareDriverの1つのオブジェクトだけが作成されるようにします。両方のスレッドで単一のオブジェクトを使用すると安全です。 – Pravin

+0

共有リソースへのアクセスを同期させる必要のある他のクラスがない場合は、A/Bでロック/アンロックを行います。重大ではない非マルチスレッドコンテキストでは、ミューテックスによってオーバーヘッドが追加される可能性があります。信じられないかもしれません:) –

答えて

0

それはメソッドhd.accessHardware()を呼び出すことにより、ハードウェアへのアクセスを要求した直前に、私はABの方法でミューテックスをロックします。

これは、従来hd.accessHardware()を呼び出すにそのミューテックスをロックし忘れるのリスクを作成します。

ここで、より多くのカプセル化のためにロックを実行することが可能かどうかは、hd.accessHardware()です。これはまだスレッドセーフであろうか?

これは、そのミューテックスをロックすることを忘れるリスクを排除し、APIを悪用しにくくします。そしてそれはまだスレッドセーフであろう。

0

++、あなたがどんなREADまたはWRITE操作を行うとき、あなたはREADONLY lockfree を残すことができますWRITINGのためにあなたのスレッドのいずれかによってアクセスされるデータがロックされていることを確認すべきです datas。 2つのオブジェクトが単一のリソースにアクセスする場合

ロック操作は危険なdeadlocksにあなたを公開します2を使用して、あなたはSINGLEセマフォ/ミューテックスを必要とする、より小さな範囲のpossibileを持っている必要があります。

この例では、HardwareDriverクラス内にミューテックスを追加し、クラスデータを読み書きするたびにロック/ロック解除する必要があります。

ローカルデータをロック(割り当てられたローカル変数をスタック)する必要はなく、reentrantメソッドでロックする必要はありません。代わりに、直接のpthreadの

あなたがC++を書いているし、我々は2017年なので、私はあなたが使用できると仮定して、あなたがのstd ::スレッドSTDを使用することをお勧め::ミューテックス。 Linuxでは、C++のネイティブスレッドのサポートはpthreads上の小さなラッパーであるため、それらを使用するオーバーヘッドは組み込みターゲットでも無視できます。

1

はい、HardwareDriverクラスにミューテックスを持ち、クラスメソッド内にクリティカルセクションを持つことができます。それでも安全です。オブジェクトをコピーすると、ミューテックスのコピーも作成されます。

+0

HardwareDriverは、偶発的なコピーを防ぐためにプライベートコピーコンストラクタ/代入演算子を持たなければなりません。また、ミューテックスは(明らかに)ローカルではなく、HardwareDriver – nos

関連する問題