1、在只有一个控制线程的情况下,一个单线程进程要完成多个任务,只需要把这些任务串行化,但有多个控制线程时,相互独立的任务的处理就可以交叉进行,此时只需要为每个任务分配一个单独的线程,当然只有在两个任务的处理过程互不依赖的情况下,两个任务才可以交叉执行。
2、交互的程序同样可以通过使用多线程来改善响应时间,多线程可以把程序中处理用户输入输出的部分与其他部分分开
线程标识
1、每个线程也有一个线程ID,进程ID在整个系统中是唯一的,但是线程ID不同,线程ID只有在它所属的进程上下文中才有意义
2、进程ID是用pid_t数据类型来表示的,是一个非负整数。线程ID是用pthread_t数据类型来表示。
#include <pthread.h>
int pthread_equal(pthread_t id1, pthread_t id2)
返回值:若相等,返回非0数值,否则,返回0
作用:对两个线程ID进行比较
#include <pthread.h>
pthread_t pthread_self(void)
返回值:调用线程的线程ID
作用:线程调用该函数获得自身的线程ID
线程创建
1、在POSIX线程(pthread)的情况下,程序开始运行时,它也是以单进程中的单个控制线程启动的。在创建多个控制线程之前,程序的行为与传统的进程并没有什么区别
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void*),
void *arg)
返回值:若成功,返回0,否则,返回错误编号
作用:创建一个线程
当pthread_create成功返回时,新创建线程的线程ID会被设置成thread指向的内存单元,attr参数用于定制各种不同的线程属性,如果把其置为NULL,则是默认属性,新创建的线程从start_routine函数的地址开始运行,该函数只有一个无类型指针参数arg,如果需要向start_routine函数传递的参数有一个以上(一个以上),那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。
线程终止
1、单个线程可以通过3种方式退出
(1)线程可以简单地从启动例程中返回,返回值是线程的退出码
(2)线程可以被同一进程中的其他线程取消
(3)线程调用pthread_exit
#include <pthread.h>
void pthread_exit(void *ptr)
ptr参数是一个无类型指针,与传给启动例程的单个参数类似。
进程中的其他线程也可以通过调用pthread_join函数访问这个指针
#include <pthread.h>
int pthread_join(pthread_t thread, void **ptr)
返回值:若成功,返回0,否则返回错误编码
(未完待续)
网友评论