线程介绍
*线程是计算机中独立运行的最小单位,运行时占用很少的系统资源.被看成是操作系统分配CPU时间的基本单位.
*在用户看来:各个线程同时执行.
在操作系统调度上看:各个线程交替进行,系统不停在各个线程之间切换,每个线程只有在系统分配给它的时间片内才能取得CPU的控制权,执行线程中的代码.
*在多CPU多核的主机上,多个线程是可以同时运行的.
*多线程相对多进程的优点:
>1.创建一个新的线程花费时间少
2.线程间的切换速度远快于进程间的切换速度
3.通信快,可以直接提供给其他线程使用,不必经过操作系统
4.可以提高应用程序的响应速度
5.可以提高多处理器效率
6.可以改善程序的结构
*节约资源,节约时间
*线程的私有数据:
线程号,寄存器(包括程序计数器和堆栈指针),堆栈,信号掩码,优先级,线程私有的存储空间
*线程号又称信号屏蔽字,规定了当前要屏蔽或要阻塞递送到该进程的信号集.
*编写linux下的多线程应用程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a
*连接线程库:gcc -lpthread
创建线程
一.线程创建函数 Pthread_create
如果在主线程里面创建线程,程序就会在创建线程的地方产生分支,变成两个程序执行.和多进程不同的是,子进程是通过拷贝父进程的地址空间来执行的,而线程与进程内的线程共享程序代码,一段代码可以同时被多个线程执行.
线程的创建通过函数pthread_create来完成,该函数声明如下:
**#include<pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *), void *arg);**
>函数各参数含义:
>thread:该参数是一个指针,当线程创建成功时,用来返回创建的线程ID.
>attr:该参数用于指定线程的属性,NULL表示使用默认属性.
>start:该参数为一个函数指针,指向线程创建后要调用的函数,即线程函数.
>arg:该参数指向传递给线程函数的参数
*线程创建成功后,pthread_create函数返回0,若不为0,说明创建线程失败.
*常见的错误码:
>1.EAGAIN:表示系统限制创建新的线程,例,线程数目过多
>2.EINVAL:表示第2个参数代表的线程属性非法
*线程创建成功后,新创建的线程开始运行第3个参数所指向的函数,原来的线程继续运行.
>createthread.c函数
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
int *thread(void *arq)
{
pthread_t newthid;
newthid = pthread_self();
printf("this is a new thread,thread ID = %lu\n",newthid);
return NULL;
}
int main(void)
{
pthread_t thid;
printf("main thread ,ID is %lu\n",pthread_self()); //打印主线程的ID
if(pthread_create(&thid,NULL,(void *)thread,NULL) != 0) {
printf("thread creation failed\n");
exit(1);
}
sleep(1);
exit(0);
}
线程属性
*线程创建函数pthread_create有一个参数的类型为pthread_attr_t,该结构体的定义如下:
typedef struct {
int detachstate;
int schedpolicy;
struct sched_param schedparam;
int inheritsched;
int scope;
size_t guardsize;
int stackaddr_set;
void * stackaddr;
size_t stacksize;
} pthread_attr_t;
*各个字段含义:
>detachstate:表示新创建的线程是否与进程中其他的线程脱离同步
>schedpolicy:表示新线程的调度策略
> schedparam:一个struct sched param 结构,其中有一个sched_priority整型变量表示线程的运行优先级
>inheritsched:有两种值可以选择
>scope:表示线程间竞争CPU的范围
>guardsize:警戒堆栈的大小
> stackaddr_set:堆栈地址集
>stackaddr:堆栈的地址
>stacksize:堆栈的大小