linux多线程学习(二)——线程的创建和退出
来源:互联网 发布:类似知天下资源 编辑:程序博客网 时间:2024/06/04 22:03
在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的。学习它、掌握它、吃透它是作为一个程序员的必须作为。在接下来的讲述中,所有线程的操作都是用户级的操作。在LINUX中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此他的移植性是非常好的。
创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create。在线程创建之后,就开始运行相关的线程函数。在该函数运行结束,线程也会随着退出。这是其中退出线程的一种方法,另外一种退出线程的方法就是调用pthread_exit()函数接口,这是结束函数的主动行为。在这里要注意的是,在使用线程函数时,不要轻易调用exit()函数,因为这样会使整个进程退出,往往一个进程包含着多个线程,所以调用了exit()之后,所有该进程中的线程都会被结束掉。因此,在线程中,利用pthread_exit来替代进程中的exit。
由于一个进程中的数据段是共享的,因此通常在线程退出之后,退出线程所占的资源并不会随着线程的结束而得到释放。正如进程之间可以调用wait()函数来同步中指并释放资源一样,线程之间也有类似的机制,那就是pthread_join函数.pthread_join可以将当前线程挂起,等待线程的结束,这个函数是一个阻塞函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待函数的资源就会被释放。
1、函数语法简述。
pthread_create
头文件: pthread.h
函数原型: int pthread_create (pthread_t* thread, pthread_attr_t* attr,
void* (start_routine)(void*), void* arg);
函数传入值: thread: 线程标识符
attr: 线程属性设置
start_routine:线程函数入口
arg:传递给线程函数的参数
返回值: 0: 成功
-1: 失败
pthread_exit
头文件: pthread.h
函数原型: void pthread_exit (void* retval);
函数传入值:retval:pthread_exit()调用者线程的返回值,可又其他函数如pthread_join来检索获取。
phread_join
头文件: pthread.h
函数原型: int pthread_join (pthread_t thread, void** thread_return);
函数传入值:thread:等待线程的标识符。
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL值);
函数返回值:成功: 0
失败:-1
2、函数举例实现。
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<pthread.h>void *thread_function(void *arg);char message[] = "Hello world";int main(){int res;pthread_t a_thread;void *thread_result;res = pthread_create(&a_thread,NULL,thread_function,(void *)message);if(res != 0){perror("Thread creation failed");exit(EXIT_FAILURE);}printf("Waiting for thread to finish...\n");res = pthread_join(a_thread,&thread_result);if(res != 0){perror("Thread join failed");exit(EXIT_FAILURE);}printf("Thread joined,it returned %s\n",(char *)thread_result);printf("Message is now %s\n",message);exit(EXIT_SUCCESS);}void *thread_function(void *arg){printf("thread_function is running.Argument was %s\n",(char *)arg);sleep(3);strcpy(message,"Bye");pthread_exit("Thank you for the CPU time");}
在上面的例子中只是简单的创建了线程、主动退出线程和挂起线程。在下一篇文章中,将讲述线程线的属性及其设定。
~~END~~
- linux多线程学习(二)—线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- linux多线程学习(二)——线程的创建和退出
- Linux--多线程之线程的创建和退出
- linux线程的创建和退出(二)
- java多线程学习(二)——线程的创建
- Linux多线程基础学习(二)创建新的线程
- 多线程编程(2): 线程的创建、启动、挂起和退出
- Windows平台的线程——创建和退出
- 线程的创建和退出
- 线程的创建和退出
- 《linux下线程的创建,同步和退出》
- modprobe和insmod的区别
- GridView中读出数据库中的数据
- Ubuntu Linux 入门(六):Ubuntu 常用软件推荐
- 快速搭建节日促销专题
- 浅谈数据库设计技巧
- linux多线程学习(二)——线程的创建和退出
- Real-Time SQL Monitoring using DBMS_SQLTUNE (REPORT_SQL_MONITOR, REPORT_SQL_MONITOR_LIST and REPORT_
- linux多线程学习(三)——线程属性设置。
- 变频器供电的异步电动机电气制动方法与原理
- 关于Grails的GSP中Form表单防止注入问题
- 各种通用对话框
- linux多线程学习(四)——互斥锁线程控制
- slurm(1): sinfo squeue scancel
- 移植过程问题总结