精英盒子 -> 程序设计 -> [正式版]pthread多线程 [打印本页]

墨阐 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函数原型:

  1. 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.

  1. extern int pthread_join (pthread_t__th, void**__thread_return);

作用是等待指定线程结束.
第一参数为被等待的线程tid,第二参数为保存返回值的变量指针.
可以据此建立一个线程执行阻塞.
现在比较难搞的是join貌似只能阻塞一次,没找到能循环阻塞(……)的方法.
而刚才在"注释"中提到的kill,因为没想好怎么让线程达到暂停状态,暂时按下不表.
原型

  1. int pthread_kill(pthread_t thread, int sig);

其中第一参数为线程tid,第二参数为signal.线程内部使用signal(sig,sig_handler)来调用sig_handler执行预定功能.
最后多句嘴,不懂的,多百度.
内事不决问百度,
外事不决问狗狗.
拍砖随意.
Rev.201101

kevin 2012-02-05 10:43
DTDTDT留名

whtsky 2012-02-05 11:51
啥…c++0x不是包含多线程了么

墨阐 2012-02-05 12:15
#2 VS2010……不想下.

内容来自[手机版]

jybox 2012-02-05 15:58




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.038046 second(s),query:5 Gzip enabled