| 墨阐 |
2012-02-05 08:15 |
[正式版]pthread多线程
有人会对标题中的框子产生疑问.为什么是"正式版"呢? 现在jy和whtsky同志来做解答:
基本木听懂[jybox 2012-02-04 18:53] 墨阐发的技术贴至今一个都没看懂[whtsky 2012-02-04]
基于如此(绿坝河蟹)的原因,我决定重写.并且把整个pthread,能写的都写上. 正文: 为了可移植这种迷人的特性(虽然我知道这不太可能),我采用pthread代替WINAPI作为多线程API.传送门:http://baike.baidu.com/view/974776.htm Windows下需要pthread.h,可以百度下一个.Linux下gcc需要-lpthread. 建立线程: pthread_create函数原型:
int pthread_create(pthread_t*restrict tidp,const pthread_attr_t*restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
其中,第一个为线程地址指针,第二个为线程属性(基本NULL就行了),第三个为线程函数,第四个为一个参数指针. 为了传多个参数,一般传一个结构体指针.因为结构体在线程函数中会被copy一遍(还是fork?),所以在线程函数结尾需要free掉结构体. 关于线程的控制: 由于多线程下载的特性(有时需要暂停而不是停止),pthread_stop变得不太适用. /* 好吧,说到这突然觉得pthread_stop也可以,只是需要处理好信息保存. 说到这突然觉得pthread_kill(注意,是发送信号,不是杀死!是PostMessage,不是TerminateThread!)一个信号过去让线程处理好再sleep也不错… 又觉得用pthread_join也不错…… */ 原本的想法是用互斥锁.pthread_mutex_init建立锁,pthread_mutex_(un)lock加(解)锁,由线程互斥阻塞线程执行来达到暂停/恢复的目的.pthread_mutex_destroy销毁互斥锁. 另一种方法是pthread_join.
extern int pthread_join (pthread_t__th, void**__thread_return);
作用是等待指定线程结束. 第一参数为被等待的线程tid,第二参数为保存返回值的变量指针. 可以据此建立一个线程执行阻塞. 现在比较难搞的是join貌似只能阻塞一次,没找到能循环阻塞(……)的方法. 而刚才在"注释"中提到的kill,因为没想好怎么让线程达到暂停状态,暂时按下不表. 原型
int pthread_kill(pthread_t thread, int sig);
其中第一参数为线程tid,第二参数为signal.线程内部使用signal(sig,sig_handler)来调用sig_handler执行预定功能. 最后多句嘴,不懂的,多百度. 内事不决问百度, 外事不决问狗狗. 拍砖随意. Rev.201101 |
|