posix多线程程序设计 pdf,
使用Posix标准线程库编程
c复习-使用Posix标准线程库编程用pthread编程用pthread?Pthread是什么?
Pthread作为C/C编程的标准线程库,其实就是POSIX标准线程库。
那么,如何理解POSIX标准呢?
下面是一些资料的链接,有兴趣的可以自行查阅。
1.http://zh.wikipedia.org/wiki/POSIX
2.standards.ieee.org/findstds/standard/1003.1-2008.html
3.www.opengroup.org/austin/papers/posix_faq.html
4.www.unix.org/version3/ieee_std.html
在哪里可以找到Pthread的源代码实现?
如果有必要,你想阅读或者学习Pthread,那么你可以下载glibc的源代码,里面包含了Pthread的实现。
GNU ftp站点链接:http://ftp.gnu.org/gnu/glibc
Pthread APIs:
Pthread API可以分为以下四个部分:
1.线程管理:对线程的操作,如创建、挂起、连接等。包括对线程属性的一些操作。
2.互斥体:互斥体,为同步提供支持。
3.Conditionalvars:条件锁,它在共享互斥体的线程之间进行通信。
5.同步:管理同步
关于Pthread接下来的中文学习还有很多资料,这里就不介绍更多的相关知识了。如果你是新手,
那么自学前请参考相关资料和书籍。请见谅~
在pthread_exit和pthread_join上。
记得考试前一天,我的大四研究生问了我一个问题:他说他在用Pthread库的时候,他创建的worker线程不行了,让我帮他。
他解决了这个问题。现在我已经忘记了他当时写的代码,但是我还记得问题,所以我可以用另一个小例子来代替:
查看代码?123456789101112131415161718192021222232282930313233343637383940414243444454647 # include stdio . h # include stdlib . h # include unistd . h # include pthread . h # define THREAD _ NUMS 20//worker void * Greeting(voidint main(int args,char * * argv){ pthread _ t workers[THREAD _ NUMS];int retvalint索引;char *msg=Hello Pthread!;for(索引=0;索引线程_ NUMS;index){ retval=pthread _ create(workers[index],NULL,Greeting,(void *)msg);if(retval==-1){printf(%sn , error!);退出(-1);} }//pthread _ exit(NULL);返回EXIT _ SUCCESS} void * Greeting(void * msg){ printf( Thread # % LD,Greeting %sn ,(long)pthread_self(),(char *)msg);us LEEP(1000000);}看到我在上面的代码中把pthread_exit(NULL)去掉了,预测这个小程序会怎么样其实很简单。也就是说,只有一部分创建的线程被完成
对于指定的作业,由于主线程已退出,另一个线程在完成该作业之前已失去其运行环境。
好了,下面是pthread_exit(NULL)的作用,就是等待所有子线程退出。
虽然pthread_join和pthread_exit具有类似的功能,但是退出状态代码可以从正在退出的子线程中获得。
注意互斥的使用:
当使用共享内存在线程间通信时,共享区域中的所有数据写操作都需要被锁定。当然,阅读操作不需要~
的常见用法如下:
?1234567pthread_mutex_lock(互斥);////.//pthread_mutex_unlock(互斥);在争锁的时候,至于使用互斥,哪个线程在争锁的时候会赢?这个问题涉及到线程的优先级调度。如果未设置,将使用优先级调度。
策略,那么锁的获取是随机的,即不可预测的。
互斥锁和条件锁一起使用:
在条件锁的操作函数中,很多都与互斥体有关,需要伙伴使用。如上所述,如果只使用互斥,则不使用优先级调度。
换句话说,我们不能指定线程之间的通信。比如线程A完成后,需要分配线程B去完成某件事。
工作,如果只使用互斥,这是做不到的,因为不能保证线程A释放锁后B能立即得到锁。所以这个时候需要使用条件锁。
条件锁通常以下列形式使用:
?123456789101112131415161718192021222232282930313233343536373839404142 void * thread _ work _ func 1(void * parm){ for(;){pthread_mutex_lock(互斥);if(xxxx){ pthread _ cond _ signal(condition);}else{//.} pthread_mutex_unlock(互斥);} } void * thread _ work _ fun 2(void * parm){ for(;){pthread_mutex_lock(互斥);pthread_cond_wait(条件,互斥);//做点什么.pthread_mutex_unlock(互斥);}}由于后面需要看glib的源代码,它的一些线程是关于pthread的,所以请大家复习一下。在下面的文章中,我将再次介绍pthread。
到时候我再考虑详细写。