免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1408 | 回复: 3
打印 上一主题 下一主题

为什么不死锁呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-24 22:05 |只看该作者 |倒序浏览
这是一道面试题。弱弱的问一下,为什么加颜色的两行不发生死锁呢?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define THRNR 4

static pthread_mutex_t mut[THRNR];

static void*
job(void *ptr)
{
     int p=(int)ptr;
     int prev, next;

     prev=p;
    next=prev+1;
    if (p==THRNR-1) {
        next=0;
    }
    while (1) {
        pthread_mutex_lock(mut+prev);
        putchar('A'+p);
        fflush(stdout);
        sleep(1);
        pthread_mutex_unlock(mut+next);
    }
    return NULL;
}

int
main()
{
    int i;
    pthread_t thr[THRNR];
    int err;
    void *tharg;

    /* Init four locks  */
    for (i=0;i<THRNR;++i) {
        pthread_mutex_init(mut+i, NULL);
        pthread_mutex_lock(mut+i);
}

    /* Create four threads */
    for (i=0;i<THRNR;++i) {
        err=pthread_create(thr+i, NULL, job, (void*)i);
        if (err) {
            fprintf(stderr, "pthread_create(): %s\n", strerror(err));
            exit(1);
        }
    }

    pthread_mutex_unlock(mut);

    for (i=0;i<THRNR;++i) {
        pthread_join(thr, NULL);
    }

    exit(0);
}

[ 本帖最后由 hassleliu 于 2008-10-24 22:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-24 22:19 |只看该作者

回复 #1 hassleliu 的帖子

请man pthread_mutex_lock。
该函数会尝试获得锁,如果该锁已经被锁住了,就会suspend。否则就锁住。

不知道你想通了没有,呵呵。

论坛徽章:
0
3 [报告]
发表于 2008-10-24 22:33 |只看该作者
死锁的几个前提是什么?

论坛徽章:
0
4 [报告]
发表于 2008-10-24 22:35 |只看该作者
谢谢, 想通了。

是两个线程分别给mutex加的锁,这时在mutex kind为fast的情况下,线程会被阻塞。只有同一线程对一个mutex两次加锁时发生死锁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP