gpt4 book ai didi

multithreading - 找出哪些线程拥有 pthread_rwlock_t

转载 作者:行者123 更新时间:2023-12-03 12:47:15 29 4
gpt4 key购买 nike

我如何才能看到(在 linux 上)哪些线程拥有 pthread_rwlock_t(或 std::shared_mutex)?
对于常规互斥锁,有 Is it possible to determine the thread holding a mutex?但是如何为 r/w 锁执行此操作?

最佳答案

你的好问题有几个问题,一个完整的答案:

  • 它取决于您正在运行的操作系统内核,甚至可能是哪个版本。
  • 它取决于您使用的 libc/libpthread,甚至可能取决于哪个编译器。

  • 假设您可以解开上面的特定配置,我们正在查看两种不同的结果:有一个写入器,或一组读取器当前导致 pthread_rw_lock() 为某些调用者阻塞。
    相比之下,互斥锁只有一个所有者,并且只有那个所有者才能释放它。
    因此,确定您的系统是否具有可查找所有者集的第一个测试是查看它是否确实记录了所有权。对此的快速解决方法是让一个线程获取用于读取或写入的 rwlock,然后向第二个线程发出信号以释放它。如果发布失败,你的实现会正确记录它,你就有机会;如果没有,您的实现可能会使用互斥锁 + condvar + 计数器实现 rwlocks;所以它没有所有权的概念。
    所以,一些代码:
    #include <stdio.h>
    #include <pthread.h>

    pthread_mutex_t lock;
    pthread_cond_t cv;
    pthread_rwlock_t rwl;
    int ready;

    void *rlse(void *_)
    {
    int *t = _;
    pthread_mutex_lock(&lock);
    while (ready == 0) {
    pthread_cond_wait(&cv, &lock);
    }
    ready = 0;
    pthread_cond_signal(&cv);
    pthread_mutex_unlock(&lock);
    *t = pthread_rwlock_unlock(&rwl);
    return 0;
    }

    void *get(void *_)
    {
    int *t = _;
    *t = (*t) ? pthread_rwlock_wrlock(&rwl) : pthread_rwlock_rdlock(&rwl);
    if (*t == 0) {
    pthread_mutex_lock(&lock);
    ready = 1;
    pthread_cond_signal(&cv);
    while (ready == 1) {
    pthread_cond_wait(&cv, &lock);
    }
    pthread_mutex_unlock(&lock);
    }
    return 0;
    }

    int main()
    {
    pthread_t acq, rel;
    int v0, v1;
    int i;
    for (i = 0; i < 2; i++) {
    pthread_rwlock_init(&rwl, 0);
    pthread_mutex_init(&lock, 0);
    pthread_cond_init(&cv, 0);
    v0 = i;
    pthread_create(&acq, 0, get, &v0);
    pthread_create(&rel, 0, rlse, &v1);
    pthread_join(acq, 0);
    pthread_join(rel, 0);
    printf("%s: %d %d\n", i ? "write" : "read", v0, v1);
    }
    return 0;
    }
    我们运行为:
    u18:src $ cc rw.c -lpthread -o rw
    u18:src $ ./rw
    read: 0 0
    write: 0 0
    这告诉我们,在任何一种情况下(rdlock、wrlock),与调用线程不同的线程都可以释放 rwlock,因此它基本上没有所有者。
    通过阅读 pthread_rwlock_unlock 的联机帮助页,我们可以稍微发现一点发现,它指出这种情况是未定义的行为,这是很好的逃避。
    Posix 建立了一个基础,而不是一个限制,因此您的实现有可能支持这种所有权。我的程序像上面那个是一个很好的调查工具;如果它出现类似 ENOTOWNER 的东西;但 EINVAL 会非常不置可否。
    glic 的 rwlock (sysdeps/htl/bits/types/struct___pthread_rwlock.h) 的内部结构:
    struct __pthread_rwlock
    {
    __pthread_spinlock_t __held;
    __pthread_spinlock_t __lock;
    int __readers;
    struct __pthread *__readerqueue;
    struct __pthread *__writerqueue;
    struct __pthread_rwlockattr *__attr;
    void *__data;
    };
    证实了我们的怀疑;起初我对队列和所有内容充满希望,但稍微深入研究代码发现它们是等待列表,而不是所有者列表。
    以上是在 ubuntu 18.04 上运行的; linux 4.15.0-112-通用;海湾合作委员会 7.5.0; glibc 2.27 libpthread 2.27。

    关于multithreading - 找出哪些线程拥有 pthread_rwlock_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63467575/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com