概况总览:
多线程能够尽可能得使用cpu资源。有几个线程就有几个栈,每一个线程就是一个栈。线程包含了进程内执行环境必须的信息,包括标识线程的线程ID,一组寄存器值,栈,调度优先级,策略,信号屏蔽字,error变量以及线程私有数据。
进程内所有的信息对于线程来讲都是共享的,包括执行代码,全局变量,对内存以及文件描述符。
线程标识:
线程ID用pthread_t表示,他并不是一个整数。可以通过pthread_self()函数获取自身的线程ID。区别于进程ID,进程ID用pid_t表示,是一个unsigned int。
包含的头文件:
#include <pthread.h>
关于编译:
g++在链接的时候要增加 -lpthread 选项。
线程创建:
所有程序开始运行的时候,每一个进程都只有一个线程,是通过单线程的方式启动的。
函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数解释:
thread,是线程的ID;attr,这个是线程的属;start_routine,是函数的入口(函数指针形式);arg,入口函数的参数数组。
返回值:
创建成功时,返回0;创建失败时,返回错误码,并且该线程不会被定义。
>---pthread_t thd_1;
>---int iResult = 0;
>---iResult = pthread_create(&thd_1, NULL, test, NULL); //创建线程
>---if (iResult != 0){
>--->---cout << "线程失败" << endl;
>---}
>---cout << "创建线程成功" << endl;
>---
>---pthread_join(thd_1, NULL); .// 线程等待
线程退出:
单个线程可以通过三个方式退出。
1.从启动函数中返回,返回值是线程的退出码。
2.可以被同一进程中其他线程取消。
3.线程调用pthread_exit() 方法 。
函数原型:
void pthread_exit(void *arg);
说明:
arg这个指针会被其他线程调用,并被pthread_join() 捕捉。
等待线程:
用于挂起当前线程,直到该线程终止为止,并将线程内存释放。一个线程所使用的内存资源在应用本函数之前不会重新分配,同一个线程只能调用一次本函数。
函数原型:
int pthread_join(pthread_t thread, void **retval);
参数解释:
retval,线程返回值。
分离线程:
函数原型:
int pthread_detach(pthread_t thread); 这个是在创建线程后,才能调用的。
以下是在创建线程之前,就将线程分离,使用的是线程属性,线程属性将在下面介绍。
-//线程准备
>---pthread_t thr_d = 0;
>---pthread_attr_t attr;
>---pthread_attr_init(&attr); //线程属性初始化
>---pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); //设置线程的可分离状态
>---pthread_create (&thr_d, &attr, test, NULL);
注意:
线程不能自身调用本函数,仅能通过其他函数调用本函数。
线程属性:
我们可以使用pthread_attr_t 结构 修改线程的默认属性,并将该属性与创建的线程联系起来。可以使用pthread_attr_init()函数将该结构初始化,初始化的结果是该属性结构所包含的内容是操作系统支持线程所有属性的默认值。我们可以通过其他函数来修改其中个别的属性值。
修改线程属性的函数:
pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3),pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3),
pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3),
pthread_attr_setscope(3), pthread_attr_setstack(3),
pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3)
pthread_getattr_np(3)
同步技术:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex); //这个是上面一个函数的非阻塞版本,如果mutex参数所指定的互斥锁已经被锁定的话,调用pthread_mutex_trylock函数不会阻塞当前线程,而是立即返回一个值来描述互斥锁的状况。
int pthread_mutex_unlock(pthread_mutex_t *mutex);