Mla*_*aKe 0 attributes mutex shared pthreads
这是我上一个问题( pthread mutex (un)locking over differentthreads )的后续问题。我对如何处理这里的问题和答案感到困惑,所以我重新尝试: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);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
main init 0 Success
t2: lock 0 Success
t1: unlock 1 Operation not permitted
Run Code Online (Sandbox Code Playgroud)
不允许 T1 解锁在 main 中初始化并由 T2 锁定的互斥锁。这不是我所期望的!由于 type ,应允许 T1 解锁互斥锁PTHREAD_PROCESS_SHARED。我错了吗 ?
如果互斥体初始化更改为使用默认属性 ( pthread_mutex_init(&m, **NULL**)),则它可以正常工作。
main init 0 Success
t2: lock 0 Success
t1: unlock 0 Success
Run Code Online (Sandbox Code Playgroud)
似乎是某种颠倒的逻辑!
永远不允许线程解锁它未锁定的 pthreads 互斥锁。对于错误检查互斥体的情况,在这种情况下会返回错误;在默认和普通互斥体的情况下,行为是未定义的。
目的PTHREAD_PROCESS_SHARED是允许使用互斥锁来同步不同进程中的线程。
| 归档时间: |
|
| 查看次数: |
6920 次 |
| 最近记录: |