0

私はLinuxに取り組んでいます。私のコードでは、RECURSIVE ミューテックスをロックしようとしているいくつかのスレッド (たとえば 2 としましょう) を実行しようとしていますが、ミューテックスにアクセスしてロックできるスレッドは 1 つだけですが、2 番目のスレッドは最初のミューテックスの後でも EBUSY エラーを取得します。スレッドがロックを解除しました。ミューテックスがPRIVETであり、SHAREDではないためだと思います。

次のように、mutex を RECRUSIVE と SHARED の両方に設定しようとしています。

    void
MutexCreate(pthread_mutex_t* _m)
{
    pthread_mutexattr_t attr; 

    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(_m, &attr); 
}

(私は関数エラーをチェックします - そしてそれらはすべて0を返します)

DEFAULT SHARED ミューテックスにしようとしても:

    void
MutexCreate(pthread_mutex_t* _m)
{
    pthread_mutexattr_t attr; 

    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(_m, &attr); 
}

それはまだPRIVETのままです。

何か案は?

4

1 に答える 1

1

同じプロセス内に実際に 2 つのスレッドがある場合、pshared属性は影響を与えるべきではありません。

EBUSYは の返品としてのみ許可されているためpthread_mutex_trylock、これを使用したと思われます。

私が持っている唯一の説明は、最初のスレッドでミューテックスを数回ロックした可能性があるということです。常にペアで来て、あなたが持っているのと同じ数の があることを確認しlockてください。unlockunlocklock

于 2012-06-28T12:54:41.060 に答える