标签:线程的控制与分离
线程的控制与分离
线程与进程:线程可以说是系统的一个执行流,它是操作系统用于调度去cpu中执行的基
本模块,线程它是在进程中存在的,进程相当于承担系统资源的一个实体,
而线程是用来去执行的,它和进程
有些是共享的:
1.文件描述符表
2.每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
3.当前工作目录
4.用户id和组id
有些是独立的:
1.栈空间
2.硬件上下文(包括各种寄存器的值,栈指针,程序计数器)
3.线程id
4.信号屏蔽字
5.errno的值
6.调度优先级
线程的控制:
在posix标准下定义了以下几个函数用于线程的控制
**编译的时候要在后面包含phread这个包
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_t *thread是一个输出型参数,用来返回一个线程号
start_routine是线程的函数,arg是传递值
pthread_arrt_t是用来设置线程的属性,我们用系统默认的NULL
该函数成功返回0;失败返回错误码
int pthread_join(pthread_t thread, void **retval);
类似于waitpid,这个函数是用来等待线程的,输出型参数retval用来输出线程的退出码
该函数成功返回0;失败返回错误码
线程的三种返回方式:
1,从线程内部return;
2,使用函数pthread_exit函数返回;
3,在外部用pthread_cancel函数取消该进程;
下面是测试代码
1 #include<stdio.h>
2 #include<pthread.h>
3 void *write1(void*arg)
4 {
5 int count=15;
6 while(count-->0)
7 {
8 printf("write thread1\n");
9 sleep(1);
10 }
11 return (void*)1;
12 }
13 void *write2(void*arg)
14 {
15 int count=18;
16 while(count-->0)
17 {
18 printf("write thread2\n");
19 sleep(1);
20 }
21 pthread_exit((void*)2);
22
23 }
24 void *write3(void*arg)
25 {
26 int count=20;
27 while(count-->0)
28 {
29 printf("write thread3\n");
30 sleep(1);
31 }
32 }
33
34 int main()
35 {
36 pthread_t thread1=0;
37 pthread_t thread2=0;
38 pthread_t thread3=0;
39 int ret=pthread_create(&thread1,NULL,write1,NULL);
40 ret=pthread_create(&thread2,NULL,write2,NULL);
41 ret=pthread_create(&thread3,NULL,write3,NULL);
42
43 int count=10;
44 while(count-->0)
45 {
46 printf("main thread\n");
47 sleep(1);
48 }
49 void *thread_wait=0;
50 ret=pthread_join(thread1,&thread_wait);
51 if(ret==0)
52 {
53 printf("write thread1 wait%u success: %d\n",(unsigned long)thread1,(int)thread_wait);
54
55 }
56 else
55 }
56 else
57 {
58 printf("write error%s\n",strerror(ret));
59 }
60 ret=pthread_join(thread2,&thread_wait);
61 if(ret==0)
62 {
63 printf("write thread2 wait%u success: %d\n",(unsigned long)thread2,(int)thread_wait);
64
65 }
66 else
67 {
68 printf("write erroe%s\n",strerror(ret));
69 }
70 pthread_cancel(thread3);
71 ret=pthread_join(thread3,&thread_wait);
72 if(ret==0)
73 {
74 printf("write thread3 wait%u success: %d\n",(unsigned long)thread3,(int)thread_wait);
75
76 }
77 else
78 {
79 printf("write erroe%s\n",strerror(ret));
80 }
81 return 0;
82 }执行结果如下
线程的分离
因为创建完线程就要去等待它,为了让创建出来的线程自生自灭,我们可以用线程分离。
默认下创建的线程均是可结合的,而使用pthread_detach可分离线程;
分离后主进程不用再等待它,它会自动释放所有资源,使得主进程可以继续运行下面的程序
3 void * pthread1(void *arg)
4 {
5 pthread_detach(pthread_self());
6 int count=5000;
7 while(count-->0){
8 printf("hello\n");
9 sleep(1);
10 }
11 printf("hello\n");
12 }
13 int main()
14 {
15 pthread_t thread1=0;
16 int ret=pthread_create(&thread1,NULL,pthread1,NULL);
17 int count=5;
18 while(count-->0){
19 printf("main hello\n");
20 sleep(1);
21 }
22 void *thread_id=0;
23 ret=pthread_join(thread1,&thread_id);
24 printf("%d\n",thread_id);
25 printf("11111\n");
26 sleep(1);
27 return 0;
28 }
~
~
"thread_detach.c" 28L, 488C 已写入 7,17-20 底端本文出自 “痕迹” 博客,请务必保留此出处http://wpfbcr.blog.51cto.com/10696766/1764723
标签:线程的控制与分离
原文地址:http://wpfbcr.blog.51cto.com/10696766/1764723