Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程已完成,但循环未结束

线程已完成,但循环未结束
EN

Stack Overflow用户
提问于 2013-06-19 13:55:12
回答 1查看 156关注 0票数 4

我写了一些线程代码,这似乎是一个错误的假设,即整数是线程安全的。现在看来,尽管它们是线程安全的,但我使用它们并不是线程安全的。我使用一个全局整数ThreadCount来保存线程数。在线程创建期间,我递增ThreadCount。在线程销毁期间,我递减它。在创建完所有线程之后,我等待它们完成(ThreadCount应该降到0),然后编写我的最终报告并退出。

但有时(5%),我永远不会达到0,即使事后检查我的日志显示所有线程都运行并完成了。因此,所有迹象都表明ThreadCount被践踏了。我一直在告诉自己,这是不可能的,因为它是一个整数,而我只使用了inc/dec。

下面是一些相关的代码:

代码语言:javascript
运行
AI代码解释
复制
var  // global
  ThreadCount : integer;            // Number of active threads
...

constructor TTiesUpsertThread.Create(const CmdStr : string);
begin
  inherited create(false);
  Self.FreeOnTerminate := true;
...
  Inc(ThreadCount);      // Number of threads created.  Used for throttling.
end;

destructor TTiesUpsertThread.Destroy;
begin
  inherited destroy;
  Dec(ThreadCount);     // When it reaches 0, the overall job is done.
end;

...
//down at the end of the main routine:

    while (ThreadCount > 0) do   // Sometimes this doesn't ever end.  
    begin
      SpinWheels('.'); // sleeps for 1000ms and writes dots... to console 
    end;

我想我的问题出在inc/dec。我想我得到的冲突是两个或更多的dec()同时命中,并且两个都读取相同的值,因此它们用相同的值替换它。例如: ThreadCount = 5,两个线程同时结束,都是5,替换为4,但新值应该是3。

这在我们的测试环境中不会遇到问题(不同的硬件、拓扑、负载等)。因此,在我尝试将此解决方案“销售”给业务部门之前,我希望确认这可能就是问题所在。

如果这是我的问题,我是否使用关键选择来保护inc/dec?

谢谢你看一看。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-19 14:03:54

如果多线程在没有保护的情况下修改变量,那么是的,您将面临数据竞争。如果两个线程试图在同一实例中递增或递减,则会发生以下情况:

  1. 将变量读入寄存器。
  2. 在寄存器中进行修改。
  3. 将新值写回变量。

该读取/修改/写入不是原子的。如果有两个线程同时执行,那么就会出现规范的数据竞争。

  • 线程1读取值,N表示。
  • 线程2读取值,与线程1读取的值相同。N。
  • 线程1向variable.
  • Thread写入N+1 2向变量写入N+1。

变量不是递增两次,而是只递增一次。

在这种情况下,不需要完整的临界区。使用InterlockedIncrement执行无锁、线程安全的修改。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17193150

复制
相关文章
如何将ReactJS与Flask API连接起来?
构建既可扩展又引人入胜的现代 Web 应用程序需要使用相关技术。ReactJS和Flask是两个流行的框架,分别用于前端和后端开发。
很酷的站长
2023/08/11
6600
如何将ReactJS与Flask API连接起来?
如何将性能测试与持续集成连接起来
作者:Yuan_Jie 链接:https://www.jianshu.com/p/edc0d171a6d1 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
顾翔
2019/12/12
1.7K0
如何将性能测试与持续集成连接起来
本体入门(一):本体构建 101
一个本体及其 classes 的实例集构成一个知识库。实际应用中,构建一个本体包括:
口仆
2020/08/15
2.4K0
您与此网站建立的连接并非完全安全
刚搭建的 HTTPS 协议,还没有过一天 在浏览器中访问就会出现 您与此网站建立的链接并非安全
hedeqiang
2019/12/17
2.1K0
本体入门(二):OWL 本体构建指南f
本文将介绍如何通过 Protege 构建 OWL 本体,文中使用的软件版本为 mac 上的 protege 5.5.0 桌面版。
口仆
2020/08/16
4.2K0
本体行业观点|当本体遇到Metaverse,将擦出怎样的火花?(下)
在 Metaverse 的经济系统中,个人可以通过工作、学习、投资等方式获得金钱,进而买卖,促进价值的流通,以搭建起价值生态。但我们需要意识到,这种价值生态不是闭环,因为 Metaverse 不是纯粹的虚拟世界,它必然要与现实世界紧密相连,才能真正引人入胜。个体在现实世界中可以打工赚钱,也可以在虚拟世界中打游戏创收,而这两种财富具有高度的流通性,属于整个大的价值生态。
本体Ontology
2021/07/12
3550
本体行业观点|当本体遇到Metaverse,将擦出怎样的火花?(下)
【本体】外轴的控制
谢谢!
EdenChen
2018/07/25
5480
【本体】外轴的控制
本体行业观点|当本体遇到Metaverse,将擦出怎样的火花?(上)
本期,我们将结合当下的热点话题——Metaverse (元宇宙),探究本体与 Metaverse 会擦出怎样的精彩火花。
本体Ontology
2021/07/12
3980
本体行业观点|当本体遇到Metaverse,将擦出怎样的火花?(上)
【本体】电机偏差值
谢谢!
EdenChen
2018/09/29
7380
【本体】电机偏差值
为避免您的信息失窃,Firefox 并未与此网站建立连接
火狐浏览器出现下面的错误,并且无法打开任何网页: 解决方法就是: 1.在浏览器中输入 about:config 2.查找下面的选项,并修改为true security.enterprise_root
青木
2019/03/15
6910
为避免您的信息失窃,Firefox 并未与此网站建立连接
知识图谱入门(三)
作为人类,我们可以基于图 1 推断出一些新的信息,例如 EID15 的举办地点是 Santiago、有航班相连的城市必定存在机场等。在这些情况下,给定图中的数据作为「前提」(premise),加上一些关于世界的通用规则作为「先验」(priori),我们就可以进行演绎来推导出新的数据,了解多比给定数据更多的信息。这些前提和先验一般被多人共享,构成了所谓的「常识知识」(commonsense knowledge);与之相反,某些信息只在一定范围内被一些专家共享,构成了所谓的「领域知识」(domain knowledge),也可以理解为只有部分人掌握的专业性知识。
口仆
2020/09/28
1.2K0
知识图谱入门(三)
本体技术视点 | 关于本体EVM合约开发,你必须知道的事(四)
本体与知名代码审计机构慢雾科技合作发布的《本体安全漏洞与威胁情报赏金计划》持续进行中,上报单个有效漏洞奖励最高可达12,000美金,受到大量开发者关注。
本体Ontology
2021/10/13
3930
本体技术视点 | 关于本体EVM合约开发,你必须知道的事(四)
本体技术视点 | 关于本体EVM合约开发,你必须知道的事(三)
上周,本体宣布支持 EVM 的测试网正式部署并向全球开发者开放 EVM 兼容公测。同时,与知名代码审计机构慢雾科技合作发布《本体安全漏洞与威胁情报赏金计划》(https://slowmist.io/en/ontology/)正式启动,上报单个有效漏洞奖励最高可达12,000美金。
本体Ontology
2021/10/13
5010
本体技术视点 | 关于本体EVM合约开发,你必须知道的事(三)
基于相似度计算的本体映射
哈哈 内容不能为空!那就写几个字嘚瑟下。。。
Coder的技术之路
2021/05/14
6160
基于相似度计算的本体映射
DeviceIoControl_苹果无法与此应用程序通信
readfile和writefile可以实现应用程序与驱动程序通信,另外一个Win32 API 是DeviceIoControl。
全栈程序员站长
2022/10/04
5280
本体技术视点 | 去中心化身份框架ONT ID刷新汽车驾驶体验
近期,本体技术视点带来了区块链领域的“芝麻信用”——OScore 的细致解读,也介绍了本体的 ONT ID 和信任锚平台 ONT TAG 如何助力币安智能链上的 STO 项目。本期技术视点将围绕本体的去中心化身份框架 ONT ID 展开。
本体Ontology
2020/09/25
7070
本体技术视点 | 去中心化身份框架ONT ID刷新汽车驾驶体验
python黑知识:python本体
python的实现有很多种,如果想研究一下它语言本身一些机制的实现,可能需要看源代码,那么,就需要找到相应的实现,分支和版本。
血狼debugeeker
2020/12/31
5460
卢策吾:通用智能本体的设想
本文报告主要介绍了对通用智能本体的设想和研究工作,从通用智能本体可迁移性、可扩展性、可群智性三大基本特性进行解读,元操作流的解析、与计算机的类比与学习、人类行为理解知识引擎、动作元操作学习等方面介绍了目前的研究进展。
马上科普尚尚
2020/05/13
1.1K0
卢策吾:通用智能本体的设想
基于本体体系的知识图谱构建
数据获取 基于自然语言处理技术的实体抽取(中文命名实体识别平台如TLP、HanLP等均提供了不错的接口),当然也可以根据项目需求采用传统的机器学习或深度学习模型进行抽取、特定领域的新词发现等(难度较高、而且不完全适用,依领域而定) 人工非结构化数据抽取(众包标注平台)、人工辅助修正 以构造的实体为出发点在相关的平台爬虫爬取结构化数据作为补充,可重复迭代 人工非结构化数据抽取 其他团队已有的研究成果、数据库数据(本体对齐) 本体建模 基于protege开源工具(https://protege.stanford
UM_CC
2022/09/22
1.2K0
【机器人】本体概述(下)
谢谢! From ABB
EdenChen
2018/04/17
4580
【机器人】本体概述(下)

相似问题

支持A-Box本体数据翻译的工具

21

如何将本体与web应用连接起来

10

使用JavaScript更改<a-box>的源

10

如何将方法与此按钮关联?

21

面向本体驱动应用的本体评估

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档