linux c 笔记 线程控制(一)

线程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源,由于每个线程占用的cpu时间是由系统分配的,因此可以把线程看成是系统分配cpu 时间的基本单位,在于用户看来,多个线程是交替执行的,系统不停的在各个线程之间切换,每个线程只有在系统分配给他的时间片内才能取得cpu的控制权,执行线程中的代码

线程的优点:节约,节约资源,节省时间,提高应用程序的响应速度,可以提高多处理器的效率,可以改善程序的结构

线程也有很多私有数据:线程号,寄存器,堆栈,信号掩码,优先级,线程私有的存储空间

一.创建线程 pthread_create函数
#include<pthread.h> 
int pthread_create ( pthread_t  *thread,const  pthread_attr_t   *attr,  (void*)(*start_routine)(void*)  ,void *arg);

第一个参数为指向线程标识符的指针,当线程创建成功的时候,用来返回创建线程的id 。
第二个参数用来设置线程属性,NULL表示默认的属性。
第三个参数是线程运行函数的起始地址,该参数是一个函数指针,指向线程创建后要调用的函数,这个被线程调用的函数也称为线程函数。
最后一个参数指向传递给线程函数的参数。

创建成功时,函数返回0,由thread指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_routine函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。
由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

二.线程属性
创建函数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,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
 .schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
 .schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
 .inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
 .scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。

时间: 2024-08-01 00:13:46

linux c 笔记 线程控制(一)的相关文章

linux c 笔记 线程控制(二)

linux 下有两种方式可以使线程终止,一种是通过调用return 从线程函数返回,第二种是通过调用函数 #includevoidpthread_exit(void *retavl); 需要注意的地方:一是,主线程中如果从main函数返回或是调用了exit函数退出主线程,则整个进程终止,此时所有的其他线程也将终止.另一种是,如果主线程调用pthread_exit函数,则仅仅是主线程消亡,进程不会结束,其他线程也不会结束,直到所有的线程都结束时,进程才结束. 线程的分离状态决定一个线程以什么样的方

linux c 笔记 线程控制(三)

错误检查函数执行错误时,一般都会返回一个特定的值,比如-1,空指针,这些值只能说明有错误发生,但错误的原因没有说明,头文件<errno.h>定义了变量errno,它储存了错误发生时的错误码,通过错误码可以得到错误的描述信息,#include <errno.h>#ifndef errnoextern int errno;#endif程序开始执行时,变量errno被初始化为0 ,许多库函数在执行过程中遇到错误就会将errno设置为相应的错误码,函数被成功调用时,它们不修改errno的值

linux c 笔记 进程控制(一)

1.进程简述 进程是一个动态的实体,操作系统资源分配的基本单位,每个进程都有一个非负整型的唯一进程 ID.因为进程 ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.    1)进程标识:    每个进程都有一个非负整型的唯一进程 ID.因为进程 ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.tmpnam 函数将进程 ID作为名字    的一部分创建一个唯一的路径名.    有某些专用的进程:进程 ID 0是调度进程,常常被称为交换进程 ( swapper )

linux c 笔记 进程控制(三)

进程退出    进程结束表示进程即将结束运行,在linux系统中进程的退出方法分为正常退出和异常退出两种.exit函数进程有三种正常终止法及两种异常终止法.(1) 正常终止:    (a) 在main函数内执行return语句.这等效于调用 exit.    (b) 调用exit函数.此函数由ANSI C定义,其操作包括调用各终止处理程序(终止处理程序在调用atexit函数时登录),然后关闭所有标准I/O流等.因为ANSI C并不处理文件描述符.多进程(父.子进程)以及作业控制,所以这一定义对

linux c 笔记 进程控制(二)---守护进程

守护进程(Daemon),一说精灵进程,是指在后台运行的,没有控制终端与之相连的程序.它独立于控制终端周期性地执行某种任务或等待处理某些发生的事件.它是一个生存期较长的进程,守护进程常常在系统引导装入时启动,在系统关闭时终止.Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond.打印进程lqd等(这里的结尾字母d就是Daemon的意思).由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的

linux c 笔记 进程控制(四)

一.更改用户 I D和组I D可以用setuid函数设置实际用户ID和有效用户ID.与此类似,可以用 setgid函数设置实际组ID和有效组ID.int setgid(gid_t gid) ;两个函数返回:若成功则为 0,若出错则为- 1关于谁能更改 ID有若干规则.现在先考虑有关改变用户 I D的规则(在这里关于用户 ID所说明的一切都适用于组 ID).(1) 若进程具有超级用户特权,则 setuid函数将实际用户 ID.有效用户 ID,以及保存的设置-用户- ID设置为uid.(2) 若进程

Linux/UNIX线程控制

线程控制 线程属性 调用pthread_create函数的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结果的指针.可以用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来.可以使用pthread_attr_init函数初始化pthreaad_attr_t结构.调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值.如果要修改其中个别属性的值,需要调用其他的函数.pt

Linux之线程、线程控制、线程属性

一.整体大纲 二.线程相关 1. 什么是线程    LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间. 独居(进程):合租(线程). Linux下: 线程:最小的执行单位 进程:最小分配资源单位,可看成是只有一个线程的进程. 2. Linux内核线程实现原理     (1)线程实现原理 类Unix系统中,早期是没有“线程”概念的,80年代才

linux线程控制&amp;线程分离

线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 线程资源 由于一个程序中的多个线程共享同一地址空间,因此代码段,数据段内容是共享的.除此之外,以下内容也是共享的: 1. 文件描述符表2. 每种信号的处理方式(SIG_IGN.SIG_DFL