ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程-避免饥饿的访问资源

2019-11-22 12:50:58  阅读:195  来源: 互联网

标签:multithreading c-3 linux


我知道这不是一个“家庭作业帮助者网站”,但是在最后几天我发疯了,因为我必须实现对资源的访问以避免饥饿,而且我不知道该怎么做.有人可以帮我提供一些应用示例或文档吗?分配是:资源可以由两种类型的进程使用:黑色和白色.当白色进程使用该资源时,黑色进程无法使用该资源,反之亦然.实现对资源的访问,避免饥饿.这是生产者-消费者案吗?

解决方法:

让我们做一些假设(为了讨论):

>我们的流程将是线程-而不是实际的软件流程,两者之间的差异可能对您的分配很重要.
>白色过程是读者.
>黑色进程就是作家.
>我们的共同资源是特定的变量.

互斥锁(mutex):

互斥锁是一种排他锁,它具有二进制状态,可以是锁定的也可以是解锁的.您可以锁定,解锁或检查它是否被锁定.

线程可以使用互斥锁(互斥锁)将彼此锁定,就像进程可以使用信号量将彼此锁定一样.

当您想保护一个变量不被两个线程同时使用时,您可以为该变量创建一个互斥锁并编写每个线程,以便它在尝试使用该变量之前尝试锁定该互斥锁,并在完成操作后将其解锁.

这使任何第一个线程锁定互斥锁和任何后续线程块,直到第一个线程解锁互斥锁为止,基本上迫使所有这些线程排队并依次对该特定变量进行操作.

当您只想读取变量而不更改其值时,这有点无效,因为读取相同内容的两个线程不会产生任何冲突或无效数据.但是,同时写入的两个线程可能会破坏数据.

Readers/Writers locks(RWL):

Readers / Write锁的大多数实现都将使用共享锁和排他锁,但是它们提供了一种简单的用法:如果要读取,则要“读取锁”,如果要写入,则要获取“写入锁”.

“读取锁”不是唯一的,它们允许多个读取器在一个特定时间进行读取(无阻塞).

“写锁”是排他的,并且只有一个写程序可以在一个特定时间进行写操作(无阻塞).

饥饿:

>第一步:读取器/写入器锁定是指第一个(读取)线程在变量上获取“读取锁定”,而第二个(写入)线程尝试获取“写入锁定”的事件,但直到所有读取器完成读取为止,该事件才被阻止.
>第二步:在第一个线程完成读取之前,第三个(读取)线程抓住变量的“读取锁”;这意味着第二个(写入)线程必须等待第三个线程完成.

重复第二步,直到饥饿.

避免因Seqlock饥饿:

一个seqlock通过一个互斥锁和一些计数器实现.它始终允许读取,即使在编写者正在写变量时也是如此,但是它为读者提供了一种在读取数据期间检查数据是否已写入的方法,如果这样可能会损坏数据,因此读者将不得不重新读取数据并再次检查一致性.

“读取和一致性检查”阶段循环运行,直到检查确认数据一致性为止,此时读者可以继续执行其通常的任务.

编写者使用互斥锁来获取独占访问权限,因此它们永远不会重叠其操作.

这对于高读低写情况很有用.如果会有太多的作者,那么读者将不断循环读取数据.

您的具体情况:

如果黑进程需要能够在彼此之间共享资源,而白进程需要能够在彼此之间共享资源,但是白进程不能与黑进程共享资源,那么解决方案将既不是RWL也不是Seqlock.

Seqlock算法的一种变体可能是您的解决方案.

标签:multithreading,c-3,linux
来源: https://codeday.me/bug/20191122/2059733.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有