これは私の前の質問 ( pthread mutex (un)locking over different threads ) の続きです。ここでの質問と回答の処理方法に戸惑ったので、もう一度試してみます:o)
プロセスとスレッドを介してミューテックスを処理しようとしており、ミューテックス属性 PTHREAD_PROCESS_SHARED を使用してこれを調整しています。私の問題を示す小さな例 (以前の投稿の Paolo の例に基づく) を追加しました。
#include <stddef.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <semaphore.h>
pthread_mutex_t m;
sem_t s1, s2;
void print(const char *s, int err)
{
printf("%s %d %s\n", s, err, strerror(err));
}
void *start_t1(void *arg)
{
sem_wait(&s1); // <-t2
print("t1: unlock ", pthread_mutex_unlock(&m));
sem_post(&s2); //->t2
}
void *start_t2(void *arg)
{
sem_wait(&s2); // <-main
print("t2: lock ", pthread_mutex_lock(&m));
sem_post(&s1); // ->t1
sem_wait(&s2); // <-t1
sem_post(&s1); // ->main
}
void main(void)
{
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
sem_init(&s1, 0, 0);
sem_init(&s2, 0, 0);
print("main init", pthread_mutex_init(&m, &mattr));
pthread_t t2, t1;
pthread_create(&t1, NULL, start_t1, NULL);
pthread_create(&t2, NULL, start_t2, NULL);
sem_post(&s2); // ->t2
sem_wait(&s1); // <-t2
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
出力は次のとおりです。
main init 0 Success
t2: lock 0 Success
t1: unlock 1 Operation not permitted
メインで初期化され、T2 によってロックされたミューテックスを T1 がロック解除することは許可されていません。これは私が期待するものではありません! タイプのため、T1 はミューテックスのロックを解除できるようにする必要がありますPTHREAD_PROCESS_SHARED
。私が間違っている ?
ミューテックスの初期化がデフォルト属性 ( pthread_mutex_init(&m, **NULL**)
) を使用するように変更されている場合、機能しています。
main init 0 Success
t2: lock 0 Success
t1: unlock 0 Success
ある種の逆論理のようです !