pthread_mutex_unlock失败的问题

发布于 2022-10-15 07:38:19 字数 2010 浏览 26 评论 0

本帖最后由 729926317 于 2011-05-07 22:15 编辑

最近在学POSIX,有些地方不理解
还望大家帮帮忙
谢了~

unlock失败我上网找了下应该是在当前线程不拥有锁的情况下会失败。
然后我这段代码那个“Fail”怎么都打印不出来,不知道什么。

  1. #include <pthread.h>
  2. #include <time.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. typedef struct my_struct_tag {
  8.     pthread_mutex_t     mutex;  /* Protects access to value */
  9.     int                 value;  /* Access protected by mutex */
  10. } my_struct_t;
  11. my_struct_t data = {
  12.     PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0};
  13. void *wait_thread (void *arg)
  14. {
  15.     int status;
  16.     status = pthread_mutex_lock (&data.mutex);
  17.     sleep (5);//等待5秒,让另一个线程解锁互斥量,来造成解锁失败
  18.     status = pthread_mutex_unlock (&data.mutex);
  19.     return NULL;
  20. }
  21. int main (int argc, char *argv[])
  22. {
  23.     int status;
  24.     pthread_t wait_thread_id;
  25.     struct timespec timeout;
  26.     status = pthread_create (&wait_thread_id, NULL, wait_thread, NULL);
  27.     sleep(1);//等待1秒,让其他线程锁住互斥量
  28.     status = pthread_mutex_unlock (&data.mutex);
  29.     printf("%d\n",status);
  30.     if(status!=0)
  31.     {
  32.         printf("Fail\n");
  33.     }
  34.     return 0;
  35. }

复制代码status输出显示是0
解锁成功?!。。。不可能啊

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

梦里梦着梦中梦 2022-10-22 07:38:19

“unlock失败我上网找了下应该是在当前线程不拥有锁的情况下会失败”这个是错的.
posix,我也不知道。。

不顾 2022-10-22 07:38:19

本帖最后由 crazyhadoop 于 2011-05-07 22:16 编辑

sleep(1);//等待1秒,让其他线程锁住互斥量  你确定其它进程可以来解锁?

status = pthread_mutex_unlock (&data.mutex); 你能确定是哪个 unlock出错了吗?
这个不对称必然有错

www.crazyhadoop.com

隱形的亼 2022-10-22 07:38:19

回复 2# peidright

http://www.mkssoftware.com/docs/man3/pthread_mutex_unlock.3.asp

这上面是这个意思。起码在当前线程不拥有互斥量的时候,解锁是会失败的。

傲影 2022-10-22 07:38:19

回复 3# crazyhadoop

我让另一个线程sleep 5秒就是为了让main的这个线程来解锁。

而在不拥有该互斥量的时候,线程对该互斥量的解锁是会失败的 http://www.mkssoftware.com/docs/man3/pthread_mutex_unlock.3.asp

我就是想捕捉到这个失败

滥情空心 2022-10-22 07:38:19

If the mutex type is PTHREAD_MUTEX_NORMAL, error detection is not provided. If a thread attempts to unlock a mutex that is has not locked or a mutex which is unlocked, undefined behavior results.

错爱 2022-10-22 07:38:19

回复 6# peidright

我在create线程之后买了线程sleep了1秒就是让刚刚创建的线程来锁住mutex
然后用main线程去解锁

这个时候这个互斥量应该已经被创建的锁住了

寄离 2022-10-22 07:38:19

代码編譯通不過
tt.c:41: warning: braces around scalar initializer
tt.c:41: warning: (near initialization for ‘data.value’)
環境:
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)

墨落画卷 2022-10-22 07:38:19

晕...失败才是正确的,你成功了才怪呢

反目相谮 2022-10-22 07:38:19

6楼正解

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文