没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
声明:本文是网上整理的资料,版权属其作者本人所有。
第一章 线程基础知识
一.什么是线程
在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个
进程内部的一个控制序列”。
典型的 unix 进程可以看成只有一个控制线程:一个进程在同一时刻只做一
件事情。有了多个控制线程以后,在程序设计时可以把进程设计成在同一时刻
能够做不止一件事,每个线程处理各只独立的任务。
二.线程的优点
(1) 通过为每种事件类型的处理分配单独的线程,能够简化处理异步时间
的代码。
(2) 多个线程可以自动共享相同的存储地址空间和文件描述符。
(3) 有些问题可以通过将其分解从而改善整个程序的吞吐量。
(4) 交互的程序可以通过使用多线程实现相应时间的改善,多线程可以把
程序中处理用户输入输出的部分与其它部分分开。
三.线程的缺点
线程也有不足之处。编写多线程程序需要更全面更深入的思考。在一个多
线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不
良影响的可能性是很大的。调试一个多线程程序也比调试一个单线程程序困难
得多。
四.线程的结构
线程包含了表示进程内执行环境必需的信息,其中包括进程中标识线程的
线程 ID,一组寄存器值、栈、调度优先级和策略、信号屏蔽子,errno 变量以及
线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行
的程序文本,程序的全局内存和堆内存、栈以及文件描述符。
五.线程标识
就像每个进程有一个进程 ID 一样,每个线程也有一个线程 ID,进程 ID 在
整个系统中是唯一的,但线程不同,线程 ID 只在它所属的进程环境中有效。线
程 ID 用 pthread_t 数据类型来表示,实现的时候可以用一个结构来代表 pthread_t
数据类型,所以可以移植的操作系统不能把它作为整数处理。因此必须使用函
数来对来对两个线程 ID 进行比较。
.
名称::
pthread_equal
功能: 比较两个线程 ID
头文件:
#include <pthread.h>
函数原形:
int pthread_equal(pthread_t tid1,pthread_t tid2);
参数: tid1进程 1id
tid2进程 2id
返回值: 若相等返回非 0 值,否则返回 0
2.
名称::
pthread_self
功能: 获取自身线程的 id
头文件:
#include <pthread.h>
函数原形:
pthread_t pthread_self(void);
参数: 无
返回值: 调用线程的线程 id
六.线程的创建
3.
名称::
pthread_create
功能: 创建线程
头文件:
#include <pthread.h>
函数原形:
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,创建默认
的线程属性。
新创建的线程从 函数的地址开始运行,该函数只有一个无类型指针参数 如果需要向 函数传递的
参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为 参数传入。
#include <pthread.h>
void printids(const char *s)
{
printf(“%s pid:%utid:%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否则提示找不到函数的错误。
具体编译方法是 cc –lpthread –o gettid gettid.c
运行结果为
main thread: pid 14954 tid 134529024
new thread: pid 14954 tid 134530048
七..线程的终止
线程是依进程而存在的,当进程终止时,线程也就终止了。当然也有在不
终止整个进程的情况下停止它的控制流。
(1)线程只是从启动例程中返回,返回值是线程的退出码。
(2)县城可以被同一进程中的其他线程取消。
(3)线程调用 pthread_exit.
.
名称::
pthread_exit
功能: 终止一个线程
头文件:
#include <pthread.h>
函数原形:
void pthread_exit(void *rval_ptr);
参数:
返回值: 无
rval_prt 是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他
线程可以调用 pthread_join 函数访问到这个指针。
.
名称::
pthread_join
功能: 获得进程的终止状态
头文件:
#include <pthread.h>
函数原形:
int pthread_join(pthread_t thread,void **rval_ptr);
参数:
返回值: 若成功返回 0,否则返回错误编号。
当一个线程通过调用 pthread_exit 退出或者简单地从启动历程中返回时,进程
中的其他线程可以通过调用 pthread_join 函数获得进程的退出状态。调用
pthread_join 进程将一直阻塞,直到指定的线程调用 pthread_exit,从启动例程中
或者被取消。
如果线程只是从它的启动历程返回,rval_ptr 将包含返回码。
#include <pthread.h>
#include <string.h>
void *thr_fn1(void *arg)
{
printf(“thread 1 returning\n”);
return((void *)1);
}
void *thr_fn2(void *arg)
{
printf(“thread 2 exiting\n”);
return((void *)2);
}
int main()
{
pthread_t tid1,tid2;
void *tret;
pthread_create(&tid1,NULL,thr_fn1,NULL);
pthread_create(&tid2,NULL,thr_fn2,NULL);
pthread_join(tid1,&tret);
printf(“thread 1 exit code %d\n”,(int)tret);
pthread_join(tid2,&tret);
printf(“thread 2 exit code %d\n”,(int)tret);
exit(0);
}
运行结果是:
thread 1 returning
thread 2 exiting
thread 1 exit code 1
thread 2 exit code 2
.
名称:
功能: 使线程进入分离状态。
头文件:
函数原形:
参数:
返回值: 若成功则返回 ,否则返回错误编号。
在默认情况下,线程的终止状态会保存到对该线程调用 !如果线
程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回。当
线程被分离时,并不能用 ! 函数等待它的终止状态。对分离状态
的线程进行 ! 的调用会产生失败,返回
"#$%&' 调用可以用于使线程进入分离状态。
(.
名称:
功能: 取消同一进程中的其他线程
头文件:
函数原形:
参数: 线程
返回值: 若成功返回 ,否则返回错误编号。
在默认的情况下, 函数会使由 标识的线程的行为表现
为如同调用了参数为 )*+"&,-&$-"'", 的 . 函数,但是,线
程可以选择忽略取消方式和控制取消方式。 并不等待线程终
止,它仅仅提出请求。
/.
名称:
0!
功能: 线程清理处理程序
头文件:
函数原形: 1!1!21!2,1!
2
1!!.
参数: 处理程序入口地址
传递给处理函数的参数
返回值: 无
剩余63页未读,继续阅读
wlabing
- 粉丝: 10
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1