有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的;一种是排版不好,直接略过了。两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每个程序员都得了一种看别人不顺眼的病,哈哈。希望大家批评指正,我这个排版和总结有什么可优化的,绝对尽力而为。
本文主要介绍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 /*主要是为了看到线程的打印*/ 20 sleep(1); 21 22 } 23 int main(int argc, char *argv[]) 24 { 25 thread_test(); 26 return 0; 27 }
线程退出函数原型:
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 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 }
取消线程函数原型:
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 }
只是简单的介绍了下线程的基本操作,更高级的应用稍后更新敬请期待~~
时间: 2024-10-08 19:06:53