gpt4 book ai didi

c - pthreads锁恢复

转载 作者:行者123 更新时间:2023-11-30 15:29:30 26 4
gpt4 key购买 nike

我正在开发一个多线程网络服务器应用程序。目前,我遇到了锁恢复问题。如果一个线程在持有锁(例如互斥锁、rwlock、自旋锁等)时意外死亡,是否可以从另一个线程恢复锁,而无需进入锁结构本身并手动取消与所有者的关联从锁上。我不想走极端来清除它,因为这将使代码不可移植。我试图通过在有问题的线程上执行 pthread_kill 并查看返回代码来强制更改锁所有者。但即使使用 PTHREAD_MUTEX_ERRORCHECK 的互斥体类型属性,如果锁定线程已退出,我仍然无法从另一个线程获得互斥体的控制权。如果线程退出时正在更新某些内部表,这可能会成为问题,因为它最终会导致整个服务器应用程序停止。

我广泛使用了 Google,但即使在这里,我也得到了相互矛盾的信息。我可以探讨什么建议或想法吗?

这是在 FreeBSD 9.3 上使用 clang-llvm 编译器。

最佳答案

对于在进程之间共享的互斥体(PTHREAD_PROCESS_SHARED),您可以将它们设置为PTHREAD_MUTEX_ROBUST...但是您遇到了以下问题:受互斥体保护的状态可能无效——具体取决于应用程序。

对于不在进程之间共享的互斥体,不存在“鲁棒性”的标准概念,因为线程不能自发地自行终止——线程将一直运行,直到它被取消、退出或进程退出或死了。

您可以使用:

  void pthread_cleanup_push(void (*routine)(void*), void *arg);
void pthread_cleanup_pop(int execute);

如果线程在持有互斥锁的情况下被取消或退出,则安排释放互斥锁 - 类似于:

  pthread_mutex_lock(&foo) ;      // as now
pthread_cleanup_push(pthread_mutex_unlock, &foo) ; // extra step

....

pthread_cleanup_pop(true) ; // replacing the pthread_mutex_unlock()

但是:您仍然需要非常仔细地考虑当线程取消或退出时受互斥锁保护的数据处于什么状态!!

您最好检查线程为什么需要这个,并且也许整理出任何错误/异常处理,以将错误/异常向上传递到临界区之外(干净地离开临界区)。

关于c - pthreads锁恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26229205/

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