文档介绍:声明: 本文是网上整理的资料, 版权属其作者本人所
有。
第一章线程基础知识
一. 什么是线程在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个
进程内部的一个控制序列”。
典型的 unix 进程可以看成只有一个控制线程:一个进程在同一时刻只做一
件事情。有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻能
够做不止一件事,每个线程处理各只独立的任务。
二. 线程的优点
(1) 通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间
的代码。
(2) 多个线程可以自动共享相同的存储地址空间和文件描述符。
(3) 有些问题可以通过将其分解从而改善整个程序的吞吐量。
(4) 交互的程序可以通过使用多线程实现相应时间的改善,多线程可以把
程序中处理用户输入输出的部分与其它部分分开。
三. 线程的缺点线程也有不足之处。编写多线程程序需要更全面更深入的思考。在一个多线
程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的。调试一个多线程程序也比调试一个单线程程序困难得多
四. 线程的结构线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的
线程 ID,一组寄存器值、栈、调度优先级和策略、信号屏蔽子,errno 变量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局内存和堆内存、栈以及文件描述符。
五. 线程标识
就像每个进程有一个进程 ID 一样,每个线程也有一个线程 ID,进程 ID 在
整个系统中是唯一的,但线程不同,线程 ID 只在它所属的进程环境中有效。线
程 ID 用 pthread_t 数据类型来表示,实现的时候可以用一个结构来代表 pthread_t
数据类型,所以可以移植的操作系统不能把它作为整数处理。因此必须使用函数
来对来对两个线程 ID 进行比较。
1.
名称::
pthread_equal
功能:
比较两个线程 ID
头文件:
#include <>
函数原形:
int pthread_equal(pthread_t tid1,pthread_t tid2);
参数:
tid1 进程 1id
tid2 进程 2id
返回值:
若相等返回非 0 值,否则返回 0
2.
名称::
pthread_self
功能:
获取自身线程的 id
头文件:
#include <>
函数原形:
pthread_t pthread_self(void);
参数:
无
返回值:
调用线程的线程 id
六. 线程的创建
3.
名称::
pthread_create
功能:
创建线程
头文件:
#include <>
函数原形:
int pthread_create(pthread_t *restrict tidp,const pthread _attr_t
*restrict attr,void *(*start_rtn)(void),void *restrict arg);
参数:
返回值:
若成功返回则返回 0,否则返回错误编号
当 pthread_creat 成功返回时, tidp 指向的内存单元被设置为新创建线程的线程 ID。attr 参数用于定制各种不同的线程属性。可以把它设置为 NULL,创建默认的线程属性。
新创建的线程从 start_rtn 函数的地址开始运行,该函数只有一个无类型指针参数 arg,如果需要向 start_rtn 函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为 arg 参数传入。
#include <>
void printids(const char *s)
{
printf(“%s pid:%u tid:%u \n“, s,getpid(),pthread_self());
}
void *thr_fn(void *arg)
{
printids(“new thread: “);
}
int main()
{
int err; pthread_t tid; err=pthread_create(&tid,NULL,thr_fn,NULL); if(err=0)
printf(“can’t create thread:%s\n”,strerror(err));
printids(“main thread: “);
sleep(1);
exit(0);
}
关于进程的编译我们都要加上参数–lpthread 否则