Linux多线程互斥锁和条件变量应用_第1页
Linux多线程互斥锁和条件变量应用_第2页
Linux多线程互斥锁和条件变量应用_第3页
Linux多线程互斥锁和条件变量应用_第4页
Linux多线程互斥锁和条件变量应用_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简述Lin ?x ?变量应用遵 循 X 接口 ,称为 read。写 ux序,需要使用头 文 read.h,链接时需要使用库a 是进一个实体,是CPU调度分派基本单位,它是比进 更小能独立运行基本单位。 自己基 本上不拥有系统资源,只拥有一点在运行中必不可少资源 (如序计数器、一组寄存器 栈),但是它可与同属一个进 其它 共享 进 所拥有 全部资源。当个任务 可以并行执行时,可以为每个任务启动一个0是并发 运行。在串行 序 基础上引入 进 是为了提供 序并 发度,从而提高 序运行效率 响应时间。与进相比, 优势 :(1)、 共享相 同内存空 间,不同可以存取内存中同一个变量;(2)、与标准 rk

2、()相比, 带来 开销很小,节省了U时间,使得创建比新进 创建快上十到一百倍。适应理由:(1)、进 相比,它是一种非常节俭”任务操 作方式,在 系统, 启动一个新 进 必须 分配给它独立 地址空 间,建立众数据表来维护它代码段、堆栈段 数 据段,这是一种 昂贵”任务工 作方式。而运行一个进 中 个 ,它们彼此之间使用相同 地址空间,共享大部分数据,启动一 个 花费 空间远远小于启动一个进 所花费 空间,而且, 问彼此 切换 所需 时间也远远小于进 间切 换所需要 时间;(2)、问方便通信机制。对不同进 来说,它们具有独立数据空间,要进行数据 传输只能通过通信 方式进行,这种方式不 仅费时,而且

3、很不方 便。则不然,同一进之间共享数据空间,所以一个数据可以直接为其它所用,这不仅快捷,而且方便。序作为一种 任务、并发工作方式,具优点包括:(1)、提供应用 序响应;(2)、使系统更加有效:操作系统会保证当数不大于PU数目时,不同运行在不同 CPU上;(3)、改善序结构:一个既长又复杂进 可以考虑分为个 ,成为 几个独立或半独立 运行部分,这样 序 利于理解 修改。eate:用于在调用进 中创 建一个新 。它有四个参 数,第一个参数为指向标识符指针;第二个参数用来设置 属性;第三个参数是运行 函数 起始 地址;第四个参数是运行函数 参数。在一个 中调用te函数创建新后,当前从eate处继续往

4、 执 行。eate函数 第三个 参数为新创建入 口函数 起 始地址,此函数接收一个参数,是通过第四个参数传递给它 ,该参数 类 型是void*,这个指针按什么类型解释由调用者自己定义,入口 函数 返回值类型也是d*,这个指针 含义同样由调用者自己定义,入口函数返回时,这个就退出 了,其它 可 以调用函数得到入口函数返回值。in: 阻塞函 数,用于阻塞当前,直到另外一个 运行结束;使一个等待另一个结束;让主阻塞在这个地方等待子结束;代码中如果没有join主 会很快 结束从而使整个进 结 束,从而使创建 没有机会开始执行就结束了,加入in后,主会一直等待直到等待 结束自己才结束,使创建有机会执行。

5、eate将一个 拆 分为两个,in()将两个合并为一个 。一个 实 际上就是一个函数,创建后,立即被执行,当函数返回时该 也就结束了。终止时,一个需要注意问题是 问同 步问题。一般情况 ,进中各个 运行是相独立终止 并不会相 通知,也不会影响其它终止所占用 资源不会随着终止 而归还系统,而是仍然为所在 进 持有。一个 仅允许一个使用等待它 终止,并且被等待应该 处于可in状态,而非状态。一个可”所占 用 内存仅 当有 对 其执行了in()后才会释放,因此为了避免内存泄露,所有 终 止时,要么设为ED,要么使用n来回收资源。一个不能被个等待。所有 都 有一个 号,也就是 d,其类型为 d_t,通

6、过调用 f函数可以获得自身 号。同步几种基本方式:join、卜读写 -lock)、变量bles)。本质是,而变量本质是等待。如果有其它 想要进入 结束后才可以进入。: 简单 理解 就是,一个 进 入工作区后 工作区,它就会进入 等待状态,要等待工作 区内提供 间资源 独占访问控制。它是一个简单,只有持有它才可 以释放那个 。它确保了它们正在访问 共享资源 完整性,因为在同 一时刻只允许一个访问它。操作,就是对某段代码或某个变量修改 时候只能有一个 在 执行这 段代码,其它 不 能同时进入这段代码或同时修改该变量。这个代码或变量称 为临界资源。通过机制实现问 代码。同步,同一时刻只允许一个执行一

7、个关键部分有两种方式创建,静态方式动态方式。在默认情况,同一无法对同一进 行递归加,否则将发生死。所谓递归加 ,就是在同一 中试图 对 进 行两次或两次以 上 行为。解决问题 方法就是显示地在变量初始化时将其设置成属性。量是一 种用于 中同步 访问方法,它允许序 住某个对象或 者某段代码,使得每次只能有一个 访问它。为了控制对关键对象或者代码 访问,必须在进入这段代码之前 住一个量,然后在完成 操作之后解 。量用ex_t数据类型来表示,在使用 变量之前,必须首先对它进行初始化,可以把它置为常量(只对静态分配 量 ),也可以通过调用m函数进行初始化。如 果动态地分配 量(如调用lloc)函数,那

8、么释放内存前(free)需要使用函数。量 已经上了 ,调用访问后,要对量进行对共享资源访问,要对量进行加,如果 会阻塞,直到 量 被解。在完成了对共享资源 解。nit函数:主要用于 中初始化。如果要用默认属性初始化 量,只需把第二个参数设置为。 量属性 可以分为四种:(1)、NP,这是缺省值,也就是普通,当一个加以后,其余请求 将形成一个等待队列,并在解后按优先级获得,这种 策略 保证了资源分配 公平 性;(2)、P,嵌套,允许 次加,不同,解 后重新 竞争;(3)、NP,检错,如果该 量已经被上,那 么后续 上将会失败而不会阻塞,否则与类型相同,这样就保证 当不允许 次加 时不 会出 现最简

9、单情况 死 ;(4)、,适应,动作最简单类型,仅等待解 后重新竞争。y函数:销毁(注销);销毁一个即意味着释放它所占用资源,且要求当前处于开放状态。t ock:占有(阻塞操作);被 定,如果这个被一个 定 拥有,那么另一个要调用这个函数就会进入阻塞状态(即等待状态),直到被释放为止;量一旦 被上 后,其它 如 果想给该 量上,那么就会阻 塞在这个操作上,如果在此之前该 量已经 被其 它 上,那么该操作 将会一直阻塞在这个地方,直到获得该 为止。:释放;在操作完成后,必须调用该函数给量解,这样其它等待该才有机会获得该,否则其它将会永远阻塞。与 不 同,变量是 用来等待而不是用来上变量用来自动阻塞

10、一个,直到某特殊情况发生为止。通常 变 量同时使用变量分为两部分:变量 。 本身是 由 量保护。 在改变状态前先要住量。 变量使 我们可以睡眠等待某种出现。 变量是利用间共享个等待“变量立信号)。检测全局变量进行同步一种机制,主要包括两 个动作:成立”而挂起;另一个使“成立”给出成是在 保护 进 行。如果一个为假,一个自动阻塞,并释放等待状态改变 。 如果另一个 改变了 ,它发信号给关联变量,唤醒一个或个等待它,重新获得,重新评价 。如果两共享可读写内存,变量可以被用来实现这两间 同 步。一个 明显 缺点 是它只有两种状态,定 非定。而 变量 通过允许 阻塞等待另一个发送信号方法弥补了不足,它

11、常一起使用。使用时,变量被 用来阻塞一个,当 不满 足时,往往解 开相应 并等待 发生变 化。一旦其它某个 改变了 变量,它将通知相应 变量唤醒一个或个正被此 变量阻塞 。这些 将 重新 定 并重新 测试 是 否满足。一般来说, 变量被 用 来进行 间同 步。 变量只 是起阻塞 唤醒 作用,具体 判断还需用 户给出。 被唤醒 后,它将重新检查判断是否满足,如果还不满足,一般说来应该仍 阻塞在这里,被等待被 一次唤醒。这个过 一般用le语句实现。变量用nd_t结构体来表示。it:初始化一个 变量,当第二个参 数属性为空指针时, 函数创建是一个缺省变量,否则变量属性将由第二个参数属性值来决定。不能

12、由 个同时初 始化一个 变量。当需要重新初始化或释放一个变量时,应用 序必 须保证这个 变量未 被使用。it:阻塞在变量上,函数将解 第二个参数指向,并使当前阻塞在第一个参数指向 变 量上。被阻塞 可以 被、st函数唤醒,也可能在被信号中断后被唤醒。一般一个表达式都是在一个 保护被检查。当 表达 式未被满足时,将仍然 阻塞在这个 变量上。当另一个改变了值并向变量发出信号时,等待在这个 变量上 一个或所有被唤醒,接着都试图再次占有相应。阻塞在 变量上 被唤醒以后,直到it函数返回之前,值都 有可能发生变化。所以函数返 回以后,在定相应 之 前,必须重新测试 值。最好测 试方法是循环 调用函数,并

13、把满足 表达式 置为循环 终止。阻塞在同一个 变量上 不同 被释放 次序是不 一定。it函数是退出点,如果在调用 这个函数时,已有一个挂起 退出请 求,且 允许 退出,这个 将 被终止并开始执行善后处理函数,而 这时变量相关 仍 将处在定状态。gnal:解除在 变量上阻塞。此函数被用来释放被阻塞 在指定 变量上 一个。一般在保护 使用相 应 变 量,否则对 变量解有可能发生在定 变量之前,从而造成死 。唤醒阻塞在 变量上 所有顺序由调度策略决定。t:阻塞直到指定时间。函数到了一定时间,即使未 发生也会解除阻塞。这个时间由第三个参数指定。st:释放阻塞所有。函数唤醒所有被wait函数阻塞在某个

14、变量 上 。当没有阻塞在这个变量上 时,此函数无效。此函数唤醒所有阻塞在某个 变量上 ,这 些被唤醒后将再次竞争相应。:释放变量。变量占用空间未被释放itwait 一定要在 tex 定区域内使用;而gnalast无需考虑调用是否是utex 拥有者,可以在 ck与 k以外区域调用。一个特定只能有一个 对象,而且 变 量应该表示 数据 内部'一种特殊更改。一个 对 象可以有许 变量,但每个 变量只能有一个对象。以上所有相关函数,函数执行成功时返回,返回其它非0值表示错误c以是一些测试例子:ead.cpp:de de depace std;void* run(void* para)d!&qu

15、ot;<nd 5 s,在正式代码中,一般不要用函数int* iptr = (int*)(void*)para)0;*)(void*)para)1;char* str = (char*)(void*)para)2;cout << *iptr << " " << *fptr << " " << str << endl;d!"<n (void *)0);int main()eint err = -1;int ival = 1;fval = 10.0F;char buf

16、口 = "func"void* para3 = &ival, &fval, buf ;eate(&pid, NULL, run, para);if (err != 0) d!" << endl;n -1;新创建之后主 如何运行-主按顺序继续执行一行序d!" << endl;新 结束 时如何处理-新 先停 止,然后作为其清理过一部分,等待与另一个合并或连接”in(pid, NULL);cout << "ok!" << endl;n 0;终端执行:- eadeadex

17、.cpp:dedepace std;ad_t tid2;er = 0;lock;void* run(void* arg)ock(&lock);ned long i = 0;er += 1;ed!" << endl;);i+);er hed!" << endl;(&lock);n NULL;int main()int i = 0, err = -1;nit(&lock, NULL) != 0) d" << endl;n -1;(i < 2) eate(&(tidi), NULL, &r

18、un, NULL);if (err != 0)d!" << endl;i+;in(tid0, NULL);in(tid1, NULL);y(&lock);cout << "ok!" << endl;+ 1;终端执行: - eadexd.cpp:dededepace std;;ero;=0;(void* arg);"<< endl;=0) cout <<= 0" << endl;wait" << endl;);wait" <<

19、; endl;);n NULL;(void* arg);"<< endl;=0) col" << endl;ero);l" << endl;+ 1;);n NULL;int main()ad_t tid1, tid2;,NULL);ero, NULL);,NULL);(2);,NULL);(2);in(tid1, NULL);in(tid2, NULL););ero);cout << "ok!" << endl;终端执行:- eaddd1.cpp:dededepace std;ck;n

20、d_;er = 0;er(void* argv);er(void* argv);int main()er << endl;ck, NULL);,NULL);ad_t thdl, thd2;int ret = -1;er, NULL);if (ret)di fail" << endl;n -1;ader, NULL);if (ret)d2 fail" << endl;n -1;er = 0;er != 10) er << endl;;er+;in(thd1, NULL);in(thd2, NULL);ck););cout << "ok!" << endl;er(void* argv)er << endl;ck);er = 0)ck); 进入阻塞(wait),等 待激活 l)-er << endl;er-;等待nal激活后再执行-er << endl;ck);n NULL;er(void* argv)cout <<er << endl;ck);er = 0);激活 l)阻塞(wai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论