pthread_mutex_unlock失败的问题
本帖最后由 729926317 于 2011-05-07 22:15 编辑
最近在学POSIX,有些地方不理解
还望大家帮帮忙
谢了~
unlock失败我上网找了下应该是在当前线程不拥有锁的情况下会失败。
然后我这段代码那个“Fail”怎么都打印不出来,不知道什么。
- #include <pthread.h>
- #include <time.h>
- #include <unistd.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct my_struct_tag {
- pthread_mutex_t mutex; /* Protects access to value */
- int value; /* Access protected by mutex */
- } my_struct_t;
- my_struct_t data = {
- PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0};
- void *wait_thread (void *arg)
- {
- int status;
- status = pthread_mutex_lock (&data.mutex);
- sleep (5);//等待5秒,让另一个线程解锁互斥量,来造成解锁失败
- status = pthread_mutex_unlock (&data.mutex);
- return NULL;
- }
- int main (int argc, char *argv[])
- {
- int status;
- pthread_t wait_thread_id;
- struct timespec timeout;
- status = pthread_create (&wait_thread_id, NULL, wait_thread, NULL);
- sleep(1);//等待1秒,让其他线程锁住互斥量
- status = pthread_mutex_unlock (&data.mutex);
- printf("%d\n",status);
- if(status!=0)
- {
- printf("Fail\n");
- }
- return 0;
- }
复制代码status输出显示是0
解锁成功?!。。。不可能啊
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
“unlock失败我上网找了下应该是在当前线程不拥有锁的情况下会失败”这个是错的.
posix,我也不知道。。
本帖最后由 crazyhadoop 于 2011-05-07 22:16 编辑
sleep(1);//等待1秒,让其他线程锁住互斥量 你确定其它进程可以来解锁?
status = pthread_mutex_unlock (&data.mutex); 你能确定是哪个 unlock出错了吗?
这个不对称必然有错
www.crazyhadoop.com
回复 2# peidright
http://www.mkssoftware.com/docs/man3/pthread_mutex_unlock.3.asp
这上面是这个意思。起码在当前线程不拥有互斥量的时候,解锁是会失败的。
回复 3# crazyhadoop
我让另一个线程sleep 5秒就是为了让main的这个线程来解锁。
而在不拥有该互斥量的时候,线程对该互斥量的解锁是会失败的 http://www.mkssoftware.com/docs/man3/pthread_mutex_unlock.3.asp
我就是想捕捉到这个失败
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.
回复 6# peidright
我在create线程之后买了线程sleep了1秒就是让刚刚创建的线程来锁住mutex
然后用main线程去解锁
这个时候这个互斥量应该已经被创建的锁住了
代码編譯通不過
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)
晕...失败才是正确的,你成功了才怪呢
6楼正解