Linux下线程实现

来源:互联网 发布:unity3d 捏脸 编辑:程序博客网 时间:2024/05/07 19:05

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的同时,还可以继续输入普通线程想说的话,两个线程并发执行。