ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

第4章 用同步信号编程

2022-02-15 19:34:05  阅读:211  来源: 互联网

标签:同步 变量 编程 cond 信号 pthread 条件 cv wait


条件变量

1. 条件变量初始化

 1 // 方法1
 2 pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
 3 
 4 
 5 // 方法2
 6 pthread_cond_t cv;
 7 pthread_condattr_t cattr;
 8 int ret;
 9 
10 /* initialize a condition variable to its default value */
11 ret = pthread_cond_init(&cv, NULL);
12 
13 
14 // 条件变量其实可以有属性,但是一般忽略,Linux中也没有实现
15 /* initialize a condition variable */
16 ret = pthread_cond_init(&cv, &cattr); 

 

 

2. 条件变量注销

int pthread_cond_destroy(pthread_cond_t *cv);

注意:条件变量注销后,并没有释放用户储存条件变量的空间

只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。

因为linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。

 

 

3. 基于条件变量阻塞

int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex);

 如果条件变量cv没有满足,pthread_cond_wait()就会释放锁+阻塞,等待唤醒;

唤醒之后,pthread_cond_wait()首先会拿到锁,然后就没有然后了,函数完成,继续往下走!

① pthread_cond_wait()要与互斥锁一起使用,即在互斥锁的保护下使用,因为该函数有一个释放锁步骤

—— 这是我理解的使用锁的原因,目前没有找到更有说服力的,待求证???

② pthread_cond_wait()建议与while()一起使用

pthread_mutex_lock();
  while(condition_is_false)
    pthread_cond_wait();
pthread_mutex_unlock();

官方给出的解释是:

唤醒的线程重新获取互斥锁并从 pthread_cond_wait() 返回之前,条件可能会发生变化,等待线程可能并未真正唤醒。

建议使用的测试方法是,将条件检查编写为调用 pthread_cond_wait() 的 while() 循环。

 

 

链接给出了一个很好的例子,可以尝试练习:生产者和使用者问题

https://docs.oracle.com/cd/E19253-01/819-7051/sync-83092/index.html

 

标签:同步,变量,编程,cond,信号,pthread,条件,cv,wait
来源: https://www.cnblogs.com/Younger-Zhang/p/15897861.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有