线程控制(一)

线程介绍

线程是计算机中独立运行的最小单位,运行时占用很少的系统资源.被看成是操作系统分配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:堆栈的大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值