当前位置: 技术问答>linux和unix
互斥量实现线程同步问题
来源: 互联网 发布时间:2016-12-22
本文导语: /*********************************************************************************/ /* 互斥量实现线程同步 */ /********************************************************************************/ #include #include #include #include struct foo { int f_count; pthread_mutex_t f_...
/*********************************************************************************/
/*
互斥量实现线程同步
*/
/********************************************************************************/
#include
#include
#include
#include
struct foo
{
int f_count;
pthread_mutex_t f_lock;
int data;
};
struct foo *foo_alloc(struct foo **fp) //分配信号空间
{
//struct foo *fp;
if ((*fp = (struct foo *)malloc(sizeof (struct foo))) != NULL)
{
(*fp)->f_count = 1; //计数初始化为1
(*fp)->data = 1; //数据为1
if (pthread_mutex_init(&(*fp)->f_lock, NULL) != 0)
{
free(*fp);
return NULL;
}
}
return *fp;
}
void foo_hold(struct foo *fp) //获取互斥量
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
}
void foo_rele(struct foo *fp) //释放互斥量
{
pthread_mutex_lock(&fp->f_lock);
if (-- fp->f_count == 0)
{
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}
else
{
pthread_mutex_unlock(&fp->f_lock);
}
}
void * fun(void * arg)
{
struct foo *p = (struct foo *)arg;
foo_hold(p);
printf("in pthread1: %dn", p->data);
p->data++;
printf("in pthread1: %dn", p->data);
/************************************************问题??***********************************************************/
//foo_rele(p); //这里没有释放下一个进程怎么还怎么用啊?
pthread_exit((void *)1 );
}
void * fun1(void * arg)
{
struct foo *p = (struct foo *)arg;
foo_hold(p);
printf("in pthread2: %dn", p->data);
p->data ++;
printf("in pthread2: %dn", p->data);
foo_rele(p);
pthread_exit((void *)1 );
}
int main()
{
pthread_t tid1;
pthread_t tid2;
int err;
struct foo *fp;
foo_alloc(&fp);
if ((err = pthread_create(&tid1, NULL, fun, (void *)fp)) != 0)
{
printf("pthread1 error!n");
}
if ((err = pthread_create(&tid2, NULL, fun1, (void *)fp)) != 0)
{
printf("pthread1 error!n");
}
//pthread_join(tid1, &p); //获取传递的参数并等待该子线程结束。
sleep(2);
printf("in main pthread:n");
return 0;
}
运行结果:
[root@localhost work]# gcc 1.c -o 1 -lpthread
[root@localhost work]# ./1
in pthread1: 1
in pthread1: 2
in pthread2: 2
in pthread2: 3
in main pthread:
[root@localhost work]#
为什么没有释放互斥量下一个进程还能拥有数据啊?
|
void foo_hold(struct foo *fp) //获取互斥量
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
}
void foo_rele(struct foo *fp) //释放互斥量
{
pthread_mutex_lock(&fp->f_lock);
if (-- fp->f_count == 0)
{
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}
else
{
pthread_mutex_unlock(&fp->f_lock);
}
}
这叫Hold么,加完就放掉了,很独立的函数,rele函数同理。
void * fun(void * arg)
{
struct foo *p = (struct foo *)arg;
foo_hold(p);
printf("in pthread1: %dn", p->data);
p->data++;
printf("in pthread1: %dn", p->data);
/************************************************问题??***********************************************************/
//foo_rele(p); //这里没有释放下一个进程怎么还怎么用啊?
pthread_exit((void *)1 );
}
调用几次,它也不可能死锁,所以注释掉很随意。
{
pthread_mutex_lock(&fp->f_lock);
fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
}
void foo_rele(struct foo *fp) //释放互斥量
{
pthread_mutex_lock(&fp->f_lock);
if (-- fp->f_count == 0)
{
pthread_mutex_unlock(&fp->f_lock);
pthread_mutex_destroy(&fp->f_lock);
free(fp);
}
else
{
pthread_mutex_unlock(&fp->f_lock);
}
}
这叫Hold么,加完就放掉了,很独立的函数,rele函数同理。
void * fun(void * arg)
{
struct foo *p = (struct foo *)arg;
foo_hold(p);
printf("in pthread1: %dn", p->data);
p->data++;
printf("in pthread1: %dn", p->data);
/************************************************问题??***********************************************************/
//foo_rele(p); //这里没有释放下一个进程怎么还怎么用啊?
pthread_exit((void *)1 );
}
调用几次,它也不可能死锁,所以注释掉很随意。
|
foo_hold里面不是lock又unlock里吗?
pthread_mutex_lock(&fp->f_lock);
fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
已经解锁了啊。
foo_rele(p)只是释放资源啊
pthread_mutex_lock(&fp->f_lock);
fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
已经解锁了啊。
foo_rele(p)只是释放资源啊