- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程学习日志精要
线程学习日志
计科3班 朱强线程概述
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程的基本操作
1创建线程
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrit attr,
void *(*start_rtn)(void),void *restrict arg);
当函数返回时,tidp指向内核分配给线程的ID,attr表示线程的属性,一般设为NULL,
start_rtn是个函数指针,start_rtn指向的函数是线程要执行的函数,一旦pthread_create成功返回,线程创建,就从start_rtn指向的函数开始执行代码。当从这个函数返回时,线程就停止运行了。
arg是start_rtn所指向的函数的参数,在线程开始执行时,该参数由内核负责传递给线程。
pthread_create函数成功调用返回0.
如果创建线程失败,返回的是错误编号
2.向线程体函数传递参数
pthread_creat函数在创建线程时由内核向新线程传递参数,如果需要传递多个参数则需要将所有参数组织在一个结构体内,再将结构体的地址作为参数传给新线程。
案例:
#include stdio.h
#include stdlib.h
#include string.h
#include pthread.h
#define BUFS PIPE_BUF //PIPE_BUF管道默认一次性读写的数据长度
struct arg_struct {
char arg1[10];
int arg2;
float arg3;
};
typedef struct arg_struct ARG;
void *thread_func(void *arg)
{
ARG *p=(ARG *)arg;
printf(arg1 is : %s,arg2 is:%d, arg3 is :%f\n,p-arg1,p-arg2,p-arg3);
return NULL;
}
int main(int argc,char *argv[])
{
pthread_t tid;
ARG arg;
int err;
//对三个参数赋值,在创建线程之前
strcpy(arg.arg1,argv[1]);
arg.arg2 = atoi(argv[2]);
arg.arg3 = atof(argv[3]);
err = pthread_create(tid,NULL,thread_func,(void *)arg);
//创建线程,并传递参数
if(err !=0)
{
printf(create thread thread_func failed:%s\n,strerror(err));
exit(1);
}
pthread_join(tid,0);//等待子线程结束
return 0;
}
运行结果:
3.线程访问资源的限制
在线程执行的过程中可以访问进程的资源,下面的例子在main函数创建了一个结构体,并初始化之,该结构体既有栈数据成员指针,又有堆数据成员指针。main线程睡眠5s,让子线程先执行,在线程thread_func()执行后,结构体数据增加。main线程使用的是已经发生改变的数据。
例子:
#include stdio.h
#include stdlib.h
#in
文档评论(0)