1.线程概述
进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。
线程通常叫做轻型的进程。线程是在共享内存空间中并发执行的多道执行路径,他们共享一个进程的资源。
因为线程和进程比起来很小,所以相对来说,线程花费更少的CPU资源。
2.线程创建和退出
在linux中,一般采用Pthread线程库实现线程的访问与控制,由POSIX提出,具有良好的可移植性。
创建线程使用pthread_create函数。在线程创建以后,就开始运行相关的线程函数。线程退出时使用函数pthread_exit,是线程的主动行为。注意进程退出时使用exit函数,线程中用pthread_exit替代exit。
由于一个进程中的多个线程共享数据段,因此通常在线程退出后,退出线程所占用的资源并不会随线程结束而释放。所有需要pthread_join函数来等待线程结束,类似于wait系统调用。
3.函数原型
#include <pthread.h>
pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *),void *arg)
thread:线程标识符
attr:线程属性设置
start_routine:线程函数起始地址
arg:传递给start_routine的参数
pthread_exit( void *retval ) //线程内退出
retval: pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。
pthread_cancel(pthread_t thread ) //线程外退出
pthread_join( pthread_t th,void **thread_return )
th:等待线程的标识符
thread_return:用户定义指针,用来存储被等待线程的返回值
pthread_t pthread_self( void ); 获取当前线程ID
创建线程与主线程通信实例:
#include <iostream> #include <pthread.h> using namespace std; //char str[100];//线程之间可以通过全局变量通信 void *fun(void *arg)//线程之间也可以通过参数进行联系 { //设置当前线程自我保护,拒绝其他线程发送过来的取消请求 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL); char *str = (char*)arg; while(1) { time_t t; time(&t); cout<<t<<":"; cout<<str<<endl;//主线程循环输出普通线程说的话 sleep(1); } return NULL; } int main() { char str[100]; cin>>str;//主线程输入想说的话 pthread_t id; pthread_create(&id,NULL,fun,str);//创建线程,接收参数str,不断输出 sleep(3); pthread_cancel(id);//取消id线程 pthread_join(id,NULL); return 0; }
运行效果:
打印出hello的同时,还可以继续输入普通线程想说的话,两个线程并发执行。