linux线程(一)基本应用

有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的;一种是排版不好,直接略过了。两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每个程序员都得了一种看别人不顺眼的病,哈哈。希望大家批评指正,我这个排版和总结有什么可优化的,绝对尽力而为。
本文主要介绍linux下线程的基本应用,列举了几个常用函数的用法及实例。
头文件 pthread.h
编译选项需要加 -pthread
 
线程创建函数原型:
1 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数说明:
thread:线程ID
attr:线程属性,通常设为NULL(用到其他属性,再来补充)
start_route():线程入口函数
arg:线程入口函数参数
例:
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4 
 5 void thread_function(void *param)
 6 {
 7     printf("this is a thread.\n");
 8 }
 9 int thread_test(void)
10 {
11     pthread_t thread_id;
12     int ret;
13     ret = pthread_create(&thread_id, NULL, (void *)&thread_function, NULL);
14     if(ret != 0) {
15         printf("pthread_create fail\n");
16         return -1;
17     }
18    
19     /*wait thread exit.*/
20     sleep(1);
21     return 0;
22 }
23 int main(int argc, char *argv[])
24 {
25     thread_test();
26     return 0;
27 }
View Code

此代码中存在一处内存泄漏问题,详情点击此处跳转

 

线程退出函数原型:

1 void pthread_exit(void *retval);
说明:
用于线程的主动退出,与return作用基本相同,但pthread_cleanup_push()和pthread_cleanup_pop()不接收return返回值。
若要在线程中终止另一个线程,需要用pthread_cancel();
参数说明:
retval:线程结束时的返回值,可由其他函数获取,如pthread_join()。
 
等待线程函数原型:
1 int pthread_join(pthread_t thread, void **retval);
说明:
等待线程退出,在等待期间当前线程将被挂起。
参数说明:
thread:等待线程的ID
retval:等待线程的返回值
例:
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4 void thread_function(void *param)
 5 {
 6     printf("this is a thread.\n");
 7     sleep(2);
 8     pthread_exit((void *)2);
 9 }
10 int thread_test(void)
11 {
12     pthread_t thread_id;
13     int ret;
14     int *retval;
15     ret = pthread_create(&thread_id, NULL, (void *)&thread_function, NULL);
16     if(ret != 0) {
17         printf("pthread_create fail\n");
18         return -1;
19     }
20     ret = pthread_join(thread_id, (void *)&retval);
21     if(ret != 0) {
22         printf("pthread_join fail\n");
23         return -1;
24     }
25     printf("thread return value is %d\n", retval);
26 }
27 int main(int argc, char *argv[])
28 {
29     thread_test();
30     return 0;
31 }
View Code
 
取消线程函数原型:
1 int pthread_cancel(pthread_t thread);
说明:
在线程中终止另一个进程。
线程可以设置状态,来决定是否可以被其他线程取消(pthread_setcancelstate),默认可以被取消。
参数说明:
thread:要取消线程的ID
例:
 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <pthread.h>
 4 pthread_t thread1_id, thread2_id;
 5 void thread_function1(void *param)
 6 {
 7     printf("this is a thread 2.\n");
 8     while(1) {
 9         printf("thread 1 is running.\n");
10         sleep(1);
11     }
12     printf("thread 1 exit.\n");
13 }
14 void thread_function2(void *param)
15 {
16     printf("this is a thread 2.\n");
17     sleep(2);
18     printf("thread 2 cancel thread 1.\n");
19     pthread_cancel(thread1_id);
20 }
21 int thread_test(void)
22 {
23     int ret;
24     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function1, NULL);
25     if(ret != 0) {
26         printf("pthread_create fail\n");
27         return -1;
28     }
29     ret = pthread_create(&thread1_id, NULL, (void *)&thread_function2, NULL);
30     if(ret != 0) {
31         printf("pthread_create fail\n");
32         return -1;
33     }
34     ret = pthread_join(thread1_id, NULL);
35     if(ret != 0) {
36         printf("pthread_join fail\n");
37         return -1;
38     }
39 }
40 int main(int argc, char *argv[])
41 {
42     thread_test();
43     return 0;
44 }
View Code

 

只是简单的介绍了下线程的基本操作,更高级的应用稍后更新敬请期待~~

posted @ 2015-10-18 22:40  _zSir  阅读(267)  评论(0编辑  收藏  举报