当前位置:  技术问答>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 );
}


调用几次,它也不可能死锁,所以注释掉很随意。

|
foo_hold里面不是lock又unlock里吗?
pthread_mutex_lock(&fp->f_lock);
    fp->f_count ++;
pthread_mutex_unlock(&fp->f_lock);
已经解锁了啊。
foo_rele(p)只是释放资源啊

    
 
 

您可能感兴趣的文章:

  • c++的boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)详解
  • 信号量可以用于多进程多线程同时互斥不?
  • 问个多线程网络服务程序的文件操作符的互斥问题
  • 多线程调用ioctl 应在哪进行互斥操作?
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • 线程同步读取变量可不可以不用互斥锁
  • 线程里互斥和条件变量一起使用的问题,有点迷惑.
  • 线程互斥问题
  • Linux下多线程互斥问题
  • 线程中互斥量的使用问题
  • (菜鸟飞飞)问个关于线程互斥的问题
  • 关于Linux多线程互斥共享资源
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 互斥锁和条件变量同步线程等待超时程序问题
  • 很简单的多线程互斥,刚接触请教大家
  • 有了信号量以后,还要线程间的互斥锁,进程间的文件锁何用?
  • Linux线程管理必备:解析互斥量与条件变量的详解
  • linux进程同步或互斥
  • 操作系统 同步互斥问题
  • 信号量实现的同步互斥机制
  • 高手请进!Solaris下如何实现原子加的操作?不用互斥量等等同步对象!
  • 使用TSL命令实现进程同步和互斥来防止竞争条件!
  • 这两天本版人气不高,我来发个问题,有关互斥同步的。大家讨论讨论
  • Unix下共享内存一个写N个读的进程同步与互斥
  • 求教,用互斥量进行同步。。。
  • 问一个简单的进程同步/互斥的问题 [C 语言]
  • Linux c++ 消费者 生产者 互斥同步 问题
  • 信号量和同步互斥
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 互斥锁的一个问题
  • 在下面这段代码中,如果对init方法只加synchronized关键字,则不能达到互斥的目的,还要再加上static关键字才能互斥,为什么?
  • wince程序防止创建多个实例实现互斥作用
  • 信号量和互斥锁有什么区别??
  • 进程对串口读写时使用互斥机制吗?
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • 条件变量和互斥量区别
  • 关于用文件实现进程互斥的问题
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 条件变量是不是一定要搭配互斥锁才能发挥作用?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 关于内核互斥体的问题
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 信号量互斥问题
  • 关于文件读些互斥的问题
  • c语言实现程序互斥问题 急.....
  • 求助 程序中添加互斥锁代码后编译怎么通不过 ?
  • 请问Unix下的进程互斥是用什么实现的?
  • 管程如何实现互斥
  • 什么进程互斥量能随进程关闭自动销毁?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3