ICode9

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

C部分互斥锁/临界区锁定

2019-09-01 18:09:02  阅读:209  来源: 互联网

标签:critical-section c events mutex


我在VS2010中使用C语言,我有一个带有一堆属性(getter和setter)的容器类(实际上是一堆具有属性的对象 – 但是让我们简化它并假设它只是一个直接在容器类上的属性.

在这个容器类中有一个Update函数,重要的是在执行Update方法时阻塞setters方法.

该应用程序是多线程的,所以我想使用互斥/事件/关键部分来处理这个问题.

我的问题是:如何在Update方法运行时锁定/阻止setter,而不让setter方法相互阻塞?此外,我还需要setter来阻止Update方法.

换句话说,我需要一个正常的Critical Section机制,除了setter不应该相互阻塞.

提前致谢,
马丁

解决方法:

如果不需要同时保护setter(例如:setPropertyX(value)),则可以使用单个信号量和手动重置事件,其中初始资源计数是您要防范的属性数.

在任何给定的setter中:

>等待设置NoUpdatePendingEvent.
>获取信号量资源(1)
>更新属性值
>发布信号量资源(1)

在主更新例程中

> NoUpdatePending事件清除
>获取信号量资源(n)
>做更新
>发布信号量资源(n)
> NoUpdatePending事件集

其中(n)是您拥有的属性数. NoUpdatePending的初始状态已设置,等待它将不会重置它(因此仅限手动重置要求).只要更新任何属性,就无法输入更新.一旦输入更新代码并清除NoUpdatePending事件,传入的prop-updates将在事件上停止并且不消耗信号量资源.所有正在运行的prop-sets最终将释放更新所需的资源以继续.

所有这些都说,仍然单独考虑属性并发性.

标签:critical-section,c,events,mutex
来源: https://codeday.me/bug/20190901/1785016.html

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

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

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

ICode9版权所有