一、县城和进程之间的关系,与进程相比线程有哪些优点?
1、线程与进程之间的关系:
(1)线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。(2) 一个进程由几个线程组成,线程与同属一个进程的其它线程共享进程所拥有的全部资源。(3)进程--资源分配的最小单位,线程--程序执行的最小单位
(4)进程有独立的地址空间,一个进程崩溃之后,在保护模式下下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
(5)线程有自己的堆栈和局部变量,单线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率差一点。
2、与进程相比有哪些优点:
(1)是一种非常节俭的多任务操作方式,在linux下,启动一个新的进程必须分配给他独立的地址空间,建立众多的数据表来维护它的代码段,堆栈段,数据段,这是一种昂贵的多任务工作方式。
(2)线程间方便地通信机制。
(3)使多CPU系统更加的高效,操作系统会保证当前线程数不大于cpu数目时,不同的线程运行于不同的cpu上。
(4)改善程序结构,一个即长又复杂的进程可以考虑分成多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
二、现成的创建,等待,退出,的api函数详解。
1、线程创建:pthread_create()
int pthread_create( pthread_t * tidp, const pthread_attr_t * attr,(void *)(*start_rtn)(void*),void* arg);
参数:tidp :为指向线程标识符的指针。
attr:用来设置线程属性。
arg:传入线程执行函数的参数
成功返回 0 ,失败 返回 错误码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
#include <stdio.h> #include <pthread.h> void *myThread1(void) { int i; for (i=0; i<3; i++) { printf("This is the 1st pthread,created by zieckey.
"); sleep(1);//Let this thread to sleep 1 second,and then continue to run } } void *myThread2(void) { int i; for (i=0; i<3; i++) { printf("This is the 2st pthread,created by zieckey.
"); sleep(1); } } int main() { int i=0, ret=0; pthread_t id1,id2; /*创建线程1*/ ret = pthread_create(&id1, NULL, (void*)myThread1, NULL); if (ret) { printf("Create pthread error!
"); return 1; } /*创建线程2*/ ret = pthread_create(&id2, NULL, (void*)myThread2, NULL); if (ret) { printf("Create pthread error!
"); return 1; } pthread_join(id1, NULL); pthread_join(id2, NULL); return 0; } |
2、线程等待退出:pthread_join()
int pthread_join(pthread_t thread ,void ** retval);
参数:thread线程标识符,就是线程id,唯一的标识线程。
retval:用户定义的指针,用来存储被等待的线程的返回值。
返回值:0 代表成功,失败 返回的是 错误号
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <pthread.h> #include <unistd.h> #include <stdio.h> void *thread(void *str) { int i; for (i = 0; i < 10; ++i) { sleep(2); printf( "This in the thread : %d
" , i ); } return NULL; } int main() { pthread_t pth; int i; int ret = pthread_create(&pth, NULL, thread, (void *)(i)); pthread_join(pth, NULL); printf("123
"); for (i = 0; i < 10; ++i) { sleep(1); printf( "This in the main : %d
" , i ); } return 0; } |
3、线程退出:pthread_exit()
void pthread_exit(void *retval)
返回值: 调用现成的返回值,可用其它函数pthread_join 来获取
查看线程的返回值:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <stdio.h> #include <pthread.h> #include <unistd.h> void *create(void *arg) { printf("new thread is created ...
"); return (void *)8; } int main(int argc,char *argv[]) { pthread_t tid; int error; void *temp; error = pthread_create(&tid, NULL, create, NULL); printf("main thread!
"); if( error ) { printf("thread is not created ...
"); return -1; } error = pthread_join(tid, &temp); if( error ) { printf("thread is not exit ...
"); return -2; } printf("thread is exit code %d
", (int)temp); return 0; } |
三、在创建线程时参数如何传递:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> struct menber { int a; char *s; }; void *create(void *arg) { struct menber *temp; temp=(struct menber *)arg; printf("menber->a = %d
",temp->a); printf("menber->s = %s
",temp->s); return (void *)0; } int main(int argc,char *argv[]) { pthread_t tidp; int error; struct menber *b; b=(struct menber *)malloc( sizeof(struct menber) ); b->a = 4; b->s = "zieckey"; error = pthread_create(&tidp, NULL, create, (void *)b); if( error ) { printf("phread is not created...
"); return -1; } sleep(1); printf("pthread is created...
"); return 0; }
|