



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
pthread_create的使用方法.txt人生重要的不是所站的位置,而是所朝的方向。不要用自己的需求去衡量别人的给予,否则永远是抱怨。1:pthread_create 函数的安全使用问题 做过linux多线程开发的人都会用过pthread_create函数,但是很少人会注意到:主线程在使用pthread_create创建线程时,如果pthread_create 函数的第四个参数(指针参数)传入的值会被主线程随时修改时,这时我们的线程从pthread_create 函数的第四个参数获取的值可能就不是我们想要传入的值了。 看看下面代码:在 main 函数的 for 循环中创建10个线程;每创建一个线程时都把循环变量 i 的值通过 pthread_create 函数的第四个参数传入线程函数中;但是线程获取的值可能不并不是我们想传入的值。#include #include void * threadFunc( void * pm_iPthreadId ) unsigned int iId = * ( unsigned int * ) pm_iPthreadId; printf( # No.%d pthread start exec; pthread id = %u !n, iId, pthread_self() ); time_t iStartTime = time( NULL ); while(1) time_t iTempTime = time( NULL ); if ( iTempTime - iStartTime 2 ) printf( $ NO.%d pthread cirle exec !n, * ( unsigned int * ) pm_iPthreadId ); iStartTime = time( NULL ); int main() pthread_t * pthreadId; pthreadId = new pthread_t10; for( unsigned int i = 0; i 10; i+ ) int iRet = pthread_create( pthreadId + i, NULL, threadFunc, &i ); if ( iRet = 0 ) printf( create No.%d pthread success; pthreadId = %u !n, i, pthreadId + i ); while(1) return 0;程序运行结果如下(结果是随机的,每次运行可能都不一样): create No.0 pthread success; pthreadId = 138174472 !# No.1 pthread start exec; pthread id = 3076803472 !# No.1 pthread start exec; pthread id = 3087293328 ! create No.1 pthread success; pthreadId = 138174476 ! create No.2 pthread success; pthreadId = 138174480 !# No.3 pthread start exec; pthread id = 3055823760 !# No.3 pthread start exec; pthread id = 3066313616 ! create No.3 pthread success; pthreadId = 138174484 !# No.4 pthread start exec; pthread id = 3045333904 ! create No.4 pthread success; pthreadId = 138174488 ! create No.5 pthread success; pthreadId = 138174492 !# No.6 pthread start exec; pthread id = 3024354192 !# No.6 pthread start exec; pthread id = 3034844048 ! create No.6 pthread success; pthreadId = 138174496 ! create No.7 pthread success; pthreadId = 138174500 !# No.8 pthread start exec; pthread id = 3003374480 !# No.8 pthread start exec; pthread id = 3013864336 ! create No.8 pthread success; pthreadId = 138174504 ! create No.9 pthread success; pthreadId = 138174508 !# No.10 pthread start exec; pthread id = 2992884624 !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec ! 从以“#”开头的字符结果可以看出:以“#No.0”、“#No.2”、“#No.5、“#No.7”、“#No.7”的字符没有;从这可以看出,我们从pthread_create 函数的第四个参数传入的值是不安全的,应该受到安全保护。2:此问题原因 pthread_create 函数是非阻塞函数;会立即返回,主线程不会在创建线程后阻塞到线程函数执行完后返回,导致线程函数获取到循环变量 i 的值被主线程立即改变。3:此问题解决方法利用条件变量的保护,在线程函数中把 pthread_create 第四个参数传入的值保存为局部变量。#include #include pthread_cond_t m_Cond;pthread_mutex_t m_Locker;void * threadFunc( void * pm_iPthreadId ) pthread_mutex_lock(&m_Locker); unsigned int iId = * ( unsigned int * ) pm_iPthreadId; printf( # No.%d pthread start exec; pthread id = %u !n, iId, pthread_self() ); pthread_cond_signal(&m_Cond); pthread_mutex_unlock(&m_Locker); time_t iStartTime = time( NULL ); while(1) time_t iTempTime = time( NULL ); if ( iTempTime - iStartTime 2 ) printf( $ NO.%d pthread cirle exec !n, * ( unsigned int * ) pm_iPthreadId ); iStartTime = time( NULL ); int main() pthread_mutex_init(&m_Locker, NULL); pthread_cond_init(&m_Cond, NULL); pthread_t * pthreadId; pthreadId = new pthread_t10; for( unsigned int i = 0; i 10; i+ ) pthread_mutex_lock(&m_Locker); int iRet = pthread_create( pthreadId + i, NULL, threadFunc, &i ); if ( iRet = 0 ) printf( create No.%d pthread success; pthreadId = %u !n, i, pthreadId + i ); pthread_cond_wait(&m_Cond, &m_Locker); pthread_mutex_unlock(&m_Locker); while(1) return 0;上面代码运行结果: create No.0 pthread success; pthreadId = 147902472 !# No.0 pthread start exec; pthread id = 3087563664 ! create No.1 pthread success; pthreadId = 147902476 !# No.1 pthread start exec; pthread id = 3077073808 ! create No.2 pthread success; pthreadId = 147902480 !# No.2 pthread start exec; pthread id = 3066583952 ! create No.3 pthread success; pthreadId = 147902484 !# No.3 pthread start exec; pthread id = 3056094096 ! create No.4 pthread success; pthreadId = 147902488 !# No.4 pthread start exec; pthread id = 3045604240 ! create No.5 pthread success; pthreadId = 147902492 !# No.5 pthread start exec; pthread id = 3035114384 ! create No.6 pthread success; pthreadId = 147902496 !# No.6 pthread start exec; pthread id = 3024624528 ! create No.7 pthread success; pthreadId = 147902500 !# No.7 pthread start exec; pthread id = 3014134672 ! create No.8 pthread success; pthreadId = 147902504 !# No.8 pthread start exec; pthread id = 3003644816 ! create No.9 pthread success; pthreadId = 147902508 !# No.9 pthread start exec; pthread id = 2993154960 !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cirle exec !$ NO.10 pthread cir
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 分红权转让合同范本
- 旧房整栋出售合同范本
- wenhua公司合伙合同范本
- 卖家卖货合同范本模板
- 大理租院子合同范本
- 汽车抵款合同范本
- 提供租赁合同范本
- 煤气安装服务合同范本
- 过度安置房合同范本
- 文化墙彩绘合同范本
- 临床营养学病例报告
- 危险作业票 安全作业票格式模板 动火登高煤气受限空间作业票
- 水电工安全考试题及答案
- 2025至2030临床前CRO治疗行业发展趋势分析与未来投资战略咨询研究报告
- 2025年浙江省中考数学试卷真题(含官方标准答案)
- 幼儿园物资报损管理制度
- 酒精戒断综合症治疗方案讲课件
- 【9语安徽中考卷】2025年安徽省中考招生考试真题语文试卷(真题+答案)
- 工程造价培训用课件
- 《人工智能概论-面向通识课程》全套教学课件
- 三区人才面试题及答案大全
评论
0/150
提交评论