菜鸟一枚,互斥锁问题

useless1991 2013-11-10 04:12:27
//互斥锁
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void *fun(void *p);

int main()
{
pthread_t pth = 0;
pthread_mutex_t mutex;
int ret = 0;
char buf[50] = {0};

ret = pthread_mutex_init(&mutex,NULL);
if(0 > ret)
{
perror("pthread_mutex_init error");
return 1;
}
ret = pthread_create(&pth,NULL,fun,&mutex);
if(0 > ret)
{
perror("pthread_create error");
return 1;
}

pthread_mutex_lock(&mutex);
printf("this parent after 10s child\n");
sleep(10);
pthread_mutex_unlock(&mutex);

pthread_join(pth,NULL);
exit;
}

void *fun(void *p)
{
pthread_mutex_t mutex = *((pthread_mutex_t *)p);
pthread_mutex_lock(&mutex);
printf("this is child after 5s parent\n");
sleep(5);
pthread_mutex_unlock(&mutex);
pthread_exit;
}

变量mutex定义为全局变量没问题,向子线程传参就不行了,会一直等待,求解?
...全文
89 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
useless1991 2013-11-12
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
不要拷贝MUTEX对象

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void *fun(void *p);
 
int main()
{
    pthread_t pth = 0;
    pthread_mutex_t mutex;
    int ret = 0;
    char buf[50] = {0};
     
    ret = pthread_mutex_init(&mutex,NULL);
    if(0 > ret)
    {
        perror("pthread_mutex_init error");
        return 1;
    }
    ret = pthread_create(&pth,NULL,fun,&mutex);
    if(0 > ret)
    {
        perror("pthread_create error");
        return 1;
    }
     
    pthread_mutex_lock(&mutex);
    printf("this parent after 10s child\n");
    sleep(10);
    pthread_mutex_unlock(&mutex);
     
    pthread_join(pth,NULL);
    exit;
}
 
void *fun_bad(void *p)
{
    pthread_mutex_t mutex = *((pthread_mutex_t *)p);
        /*
         * 不要拷贝 mutex 对象, 虽然在 FreeBSD 是可以这么做的。
         */

    pthread_mutex_lock(&mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(&mutex);
    pthread_exit;       /* 函数调用不带这么写的!!! */
}

/*
 * IEEE Std 1003.1-2008
 *
 * pthread_mutex_destroy, pthread_mutex_init - destroy and initialize a mutex
 *
 * DESCRIPTION:
 *
 * ...
 *
 * Only mutex itself may be used for performing synchronization.
 * The result of referring to copies of mutex in calls to
 * pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(),
 * and pthread_mutex_destroy() is undefined.
 *
 * ...
 */
void *fun(void *p)
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)p;
    pthread_mutex_lock(mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(mutex);
    pthread_exit(NULL);
}
引用 1 楼 mymtom 的回复:
不要拷贝MUTEX对象

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void *fun(void *p);
 
int main()
{
    pthread_t pth = 0;
    pthread_mutex_t mutex;
    int ret = 0;
    char buf[50] = {0};
     
    ret = pthread_mutex_init(&mutex,NULL);
    if(0 > ret)
    {
        perror("pthread_mutex_init error");
        return 1;
    }
    ret = pthread_create(&pth,NULL,fun,&mutex);
    if(0 > ret)
    {
        perror("pthread_create error");
        return 1;
    }
     
    pthread_mutex_lock(&mutex);
    printf("this parent after 10s child\n");
    sleep(10);
    pthread_mutex_unlock(&mutex);
     
    pthread_join(pth,NULL);
    exit;
}
 
void *fun_bad(void *p)
{
    pthread_mutex_t mutex = *((pthread_mutex_t *)p);
        /*
         * 不要拷贝 mutex 对象, 虽然在 FreeBSD 是可以这么做的。
         */

    pthread_mutex_lock(&mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(&mutex);
    pthread_exit;       /* 函数调用不带这么写的!!! */
}

/*
 * IEEE Std 1003.1-2008
 *
 * pthread_mutex_destroy, pthread_mutex_init - destroy and initialize a mutex
 *
 * DESCRIPTION:
 *
 * ...
 *
 * Only mutex itself may be used for performing synchronization.
 * The result of referring to copies of mutex in calls to
 * pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(),
 * and pthread_mutex_destroy() is undefined.
 *
 * ...
 */
void *fun(void *p)
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)p;
    pthread_mutex_lock(mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(mutex);
    pthread_exit(NULL);
}
先仰慕一下版主,长姿势了又,还有我一直认为pthread_exit和exit 可以不写参数的,不写参数有什么危害呢?
mymtom 2013-11-12
  • 打赏
  • 举报
回复
引用 3 楼 lunhuizhe1 的回复:
先仰慕一下版主,长姿势了又,还有我一直认为pthread_exit和exit 可以不写参数的,不写参数有什么危害呢?
你的写法不是不写参数的问题,你连括号的没有写; 不写的话就不会执行这个函数啊!exit; 是这个函数的地址. exit(0)才是这姓这个函数。

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

void foo(int bar)
{
    printf("foo: bar=%d\n", bar);
}

void (*pfunc)(int);

int main(int argc, char *argv[])
{

    exit;       /* 不会执行exit(0), 实际上啥作用也没有 */

    printf("%p\n", exit);

    pfunc = foo;
    pfunc(0);   /* 相当于调用了foo(0) */

    pfunc = exit;
    pfunc(0);   /* 相当于调用了exit(0) */

    printf("%s\n", "这一行不会执行");

    return 0;
}
mayer 2013-11-11
  • 打赏
  • 举报
回复
版主V5
mymtom 2013-11-10
  • 打赏
  • 举报
回复
不要拷贝MUTEX对象

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
void *fun(void *p);
 
int main()
{
    pthread_t pth = 0;
    pthread_mutex_t mutex;
    int ret = 0;
    char buf[50] = {0};
     
    ret = pthread_mutex_init(&mutex,NULL);
    if(0 > ret)
    {
        perror("pthread_mutex_init error");
        return 1;
    }
    ret = pthread_create(&pth,NULL,fun,&mutex);
    if(0 > ret)
    {
        perror("pthread_create error");
        return 1;
    }
     
    pthread_mutex_lock(&mutex);
    printf("this parent after 10s child\n");
    sleep(10);
    pthread_mutex_unlock(&mutex);
     
    pthread_join(pth,NULL);
    exit;
}
 
void *fun_bad(void *p)
{
    pthread_mutex_t mutex = *((pthread_mutex_t *)p);
        /*
         * 不要拷贝 mutex 对象, 虽然在 FreeBSD 是可以这么做的。
         */

    pthread_mutex_lock(&mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(&mutex);
    pthread_exit;       /* 函数调用不带这么写的!!! */
}

/*
 * IEEE Std 1003.1-2008
 *
 * pthread_mutex_destroy, pthread_mutex_init - destroy and initialize a mutex
 *
 * DESCRIPTION:
 *
 * ...
 *
 * Only mutex itself may be used for performing synchronization.
 * The result of referring to copies of mutex in calls to
 * pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(),
 * and pthread_mutex_destroy() is undefined.
 *
 * ...
 */
void *fun(void *p)
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)p;
    pthread_mutex_lock(mutex);
    printf("this is child after 5s parent\n");
    sleep(5);
    pthread_mutex_unlock(mutex);
    pthread_exit(NULL);
}

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧