多线程编程01 基本线程编程
作者:Lokki 出处:http://www.cnblogs.com/Swartz/ 欢迎转载,也请保留这段声明。谢谢!
线程与进程
多线程编程是程序员常用的编程方法,相对于多进程来说创建一个线程的成本(时间和空间)更低,切换更快,通信更简单。多线程还可以带来以下益处:
- 更有效地利用处理器
与之前的单核心处理器不同,现代的处理器越来越多的都是多核架构。对于多线程的程序,操作系统会保证尽可能把各线程跑在不同的核心上,这样可以更有效地利用处理器资源。
- 保持GUI界面的响应
熟悉GUI编程的程序员对界面的响应比较关注。对于单线程的程序,由于所有事情都是在主线程里面处理,如果遇到大量的数据需要处理,那么在程序处理数据的这段时间里程序就没有办法对用户的界面交互做出响应,用户体验极差。如果把需要做的数据处理工作放到一个单独的线程来做,程序的界面就可以保持对用户的响应,这样体验就得到了极大的改善。
- 占用更少的系统资源
由于创建一个线程是在当前进程的地址空间里面进行,这样操作系统就不用像创建一个新进程一样创建新的地址空间,每个进程用于创建和维护大量 状态信息的成本,与一个线程相比,无论是在时间上还是空间上代价都更高。
基本线程编程
1. 创建新线程
int pthread_create(pthread_t *tid, const pthread_attr_t *tattr, void*(*start_routine)(void *), void *arg)
tid 是表示一个线程的结构体
tattr 是创建线程的属性,默认的置为NULL
start_soutine 是新线程开始执行的函数,函数返回之后线程结束。
arg 是传给函数的参数
返回0代表创建成功,其他任何值表示创建失败。EAGAIN 表示创建的进程超过了系统允许的数量,EINVAL表示tattr的值无效。
如果没有指定属性对象,系统就会创建以下默认属性的线程:
- 进程范围
- 非分离线程
- 缺省栈和大小
- 零优先级
2. 等待线程终止
int pthread_join(thread_t tid, void **status)
tid 指定等待的线程,这个线程必须位于当前的进程中,且不能为分离线程。
status不是NULL时候,函数成功返回之后将指向的位置设置为已终止线程的退出状态。
返回0代表成功,其他任何值度表示失败。其他任何值表示错误。
pthread_join() 函数会一直阻塞调用线程,直到指定的线程终止。如果有多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止。然后一个线程成功返回,其他线程返回错误。pthread_join() 仅适用于非分离的目标线程。
3. 分离线程
int pthread_detach(thread_t tid)
tid 要分离的线程
成功返回0,其他值表示失败。
4. 其他函数
pthread_t pthread_self() 获取线程id
int pthread_equal(pthread_t tid1,pthread_t tid2) 比较线程id ,相等返回非0,否则返回0
int pthread_kill(pthread_t tid,int sig) 向线程发送信号,成功返回0,其他返回非0
void pthread_exit(void* status) 终止线程
int pthread_cancel(pthread_t tid) 取消线程,存在一定危险。
创建线程的小例子
1 #include <stdio.h> 2 #include <pthread.h> 3 4 void* func(void* p) 5 { 6 // 获得自己的线程ID 7 printf("Thread arg:%s id:%lu\n",(char*)p,pthread_self()); 8 sleep(2); 9 return (void*)42; 10 } 11 12 int main() 13 { 14 pthread_t th1; 15 pthread_t th2; 16 17 // 创建线程 18 if(pthread_create(&th1,NULL,func,"thread1")==0) 19 { 20 printf("Create thread1 success\n"); 21 } 22 23 if(pthread_create(&th2,NULL,func,"thread2")==0) 24 { 25 printf("Create thread2 success\n"); 26 // 分离线程 27 if(pthread_detach(th2)==0) 28 { 29 printf("Detached thread2 \n"); 30 } 31 } 32 33 void* p=NULL; 34 // 等待线程结束 35 if(pthread_join(th1,&p)==0) 36 { 37 printf("Thread return %d\n",(int)(p)); 38 } 39 return 0; 40 }