あなたの質問が次の場合:あるタイプのミューテックスと別のタイプのミューテックスをランダムに自由に切り替えることができますか?その場合、答えはノーです(すべての最下層がpthread_mutexなどの同じ実装を使用しない限り)。
ただし、保護するリソースのグループが異なる場合は、1つのリソースグループを1つの実装で保護できます。実際には、セマフォを使用する方がよい場合もあります(つまり、セマフォは、書き込み用に1つのロック、読み取り用に多数のロックを定義するのに役立ちます)。
したがって、管理しているリソースのグループが4つある場合は、次を使用できます。
- std :: mutex、
- pthread_mutex、
- boost :: mutex、
- セマフォ。
できないことは、boost :: mutexを使用してセマフォによって保護されているデータにアクセスすること、またはその逆、またはstd::mutexを使用してpthread_mutexによって保護されているものを使用することです。
簡単な例として、コードの観点から、これはゲッターとセッターが次のように行われることを意味します。
void set(int new_value)
{
guard lock(my_mutex);
m_value = new_value;
}
int get() const
{
guard lock(my_mutex);
return m_value;
}
2つの関数は同じミューテックス(ここ)を使用し、ミューテックスには1つのタイプがあるmy_mutex
ことは明らかです。
それに反対して、あなたはそれをすることができませんでした:
void set(int new_value)
{
guard lock(this_mutex_here);
m_value = new_value;
}
int get() const
{
SafeGuard lock(that_mutex_there);
return m_value;
}
この2番目の例では、2つの異なるミューテックスを使用しますが、ロックインによってロックインset()
がブロックされないため、期待どおりに機能しませんget()
。その逆も同様です。したがって、それについて安全なものは何もありません(たとえ警備員の1人がSafeGuardと呼ばれていても)。
したがって、ルールは、m_value
という名前のミューテックスで保護する場合my_mutex
、アクセスするときはいつでもミューテックスm_value
をロックする必要があるということですmy_mytex
。このように一貫している限り、どの実装を使用してもかまいません。