Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么连接线程不足以解决并发线程时的数据不一致问题?

为什么连接线程不足以解决并发线程时的数据不一致问题?
EN

Stack Overflow用户
提问于 2013-09-21 21:39:23
回答 3查看 77关注 0票数 0

连接两个线程意味着一个线程将在另一个线程完成其任务之后完成;因此,我们使用join()实现原子性。那为什么这还不够?在这种情况下,我们应该使用join()?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-21 21:43:58

为什么要加入?当主线程想要启动一堆并行任务线程以加快一些工作时,连接是很有用的。主线程与任务线程“连接”(即等待它们完成任务并终止)。这样,它就可以在任务已经完成的情况下向前迈进。

例如,门户主页可能需要加载一堆显示来自不同来源的数据的小部件。实现这一点的一种方法是让请求处理线程启动并行任务线程来获取数据。这样,用户就不必比最慢的任务线程等待更长的时间(大致如此),而不必等待所有数据依次加载。请求处理线程将与这些线程连接,以确保所有小部件在显示主页之前都有它们所需的数据。

关于数据不一致性的--如果任务线程都在访问共享数据,则必须有某种方法来确保它们之间不相互覆盖。其他线程正在等待任务线程完成这一事实并不能阻止这种移动。(Mosh = 种族条件)。

票数 3
EN

Stack Overflow用户

发布于 2013-09-21 21:46:47

原子性并不意味着线程应该按照特定的顺序完成。这意味着操作应该以原子方式完成,并且两个线程不应该干扰彼此的任务,这样状态remians是一致的。这是通过使用synchronized块、AtomicIntegers等来实现的。

票数 0
EN

Stack Overflow用户

发布于 2013-09-21 22:11:45

多线程对于并行地完成任务非常有用。在大多数情况下,它们都是以相同的数据为依据的。在这种情况下,总是存在数据不一致的危险。一个很好的例子是

代码语言:javascript
运行
AI代码解释
复制
Main Thread creates two threads A and B
and waits for them to execute and JOIN
Balance=1000;
Thread A wants to withdraw 300 and Thread B wants to deposit 450
Thread A reads Balance 1000
Context Switch
Thread B reads Balance 1000
Thread B adds 450 to value read.Hence, 1000+450=1450
Write back to Balance;
Balance=1450;
Context Switch
Thread A deducts 300 from value read.Hence, 1000-300=700
Write back to Balance.
Balance=700
Both threads now join the main Thread.
Main thread does further processing.

在这种情况下,即使有一个join,您也可以看到数据是如何不一致的。有必要相互排斥。

另一方面,Join用于等待线程,而可能是当主线程只在其他线程完成其任务时才希望进一步工作时。

如果不是这样,您可以分离生成的线程。然后,主线程不需要等待线程完成执行。即使如此,也需要相互排斥。

看这个,加入一个线程意味着什么?

我没有一个通用链接来解释,但我想这个解释非常适用于所有线程(不仅仅是线程)。

来自OpenGroup

pthread_join()函数将挂起调用线程的执行,直到目标线程终止为止,除非目标线程已经终止

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

https://stackoverflow.com/questions/18940744

复制
相关文章
无法在此iPhone上激活Touch ID,怎么解决?
Touch ID是苹果公司的指纹识别功能,允许用户解锁iPhone或iPad、在苹果商店购物,以及在应用程序中验证Apple Pay等等。
莉莉的碎碎念
2021/09/10
6.1K0
无法在此iPhone上激活Touch ID,怎么解决?
适当愉悦,自建 Minecraft 服务器
本文主要介绍自建 Minecraft 服务器的方法,可以使用提供的公有云服务,Minecraft 对虚拟机配置需求如下:
宋天伦
2020/07/16
7.1K1
适当愉悦,自建 Minecraft 服务器
Python 数组操作_python中数组的表示形式
在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能力。
全栈程序员站长
2022/09/22
3K0
Python 数组操作_python中数组的表示形式
【平面解析几何】直线方程的表示形式
表示与 轴、 轴相交,且与 轴截距为 、与 轴截距为 的直线
攻城狮杰森
2022/06/03
1.8K0
springboot的资源请求验证
基于SpringBoot的资源请求验证(Aspectj和Interceptor两方式实现)附JWT验证token 前言 ​ 在项目中,我们需要对前端请求的资源进行验证,判断是否具有相应的权限。比如某写资源只有在登录之后才有请求权限。本章以请求之前是否登录为权限。
崔笑颜
2020/06/08
8570
VS2010 \...\bin\rcdll.dll 无法找到资源编译器
版权声明:本文为博主原创文章,未经博主允许不得
acoolgiser
2019/01/16
1.3K0
用文字云的形式表示什么款式最畅销
前一文我们讲述了两种在Power BI中展示Top款的方式,我们有时候其实不需要具体的数字,只需直观感受,例如如下这种:
wujunmin
2021/09/07
8810
用文字云的形式表示什么款式最畅销
图解计算机中数据的表示形式
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/02/05
3K0
图解计算机中数据的表示形式
VirtualBox克隆后无法找到网卡的问题
Virtualbox现在更新到了4.1.6版本,我记得在之前的版本中,镜像的克隆只能通过命令行的方式来进行,现在已经可以通过界面来进行克隆了,可以说非常的方便。
大江小浪
2018/07/25
1.3K0
VirtualBox克隆后无法找到网卡的问题
skywalking根据文本信息找到对应的请求
在定位问题的时候,有时候需要找到导致问题出现的那个请求,比如下单。但是只有订单号,怎么去找呢? 目前我们一般是根据下单时间,然后再根据时间去找对应的请求,但是请求很多,需要一个一个打开请求内容去定位该订单的下单请求。 本文使用脚本的方式方便快速定位到对应的请求 根据时间和接口名称获取批量请求 获取批量请求 curl 'http://sky.fy.qq.com/graphql' \ -H 'Content-Type: application/json;charset=UTF-8' \ --dat
十毛
2021/11/24
6070
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
 原因:命令行执行策略,默认设置为Restricted不加载配置文件或运行脚本。需变更设置为RemoteSigned
超级小的大杯柠檬水
2023/05/06
1.4K0
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
C++核心准则E.19:如果无法选择适当的资源句柄,使用final_action表现清除处理​
finally is less verbose and harder to get wrong than try/catch.
面向对象思考
2020/08/10
5570
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
执行命令行set-ExecutionPolicy RemoteSigned 选y 即可
kirin
2021/02/26
7.1K0
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
如何找到自己的服务器
4.点击自己云服务器的实例id后,就可以看见服务器的基本信息、弹性网卡、安全组等等。
逸轩
2021/09/16
6.9K0
无法转换为内部表示
系统查询表记录时出现“java.sql.SQLException: 无法转换为内部表示”异常,抛出的异常信息如下:
程序新视界
2022/11/30
7040
修复WebView资源未找到导致的崩溃问题
近期 应用新增了很多的崩溃,分析特征,发现崩溃集中在5.0-5.1.1系统上,崩溃的日志如下
技术小黑屋
2020/11/10
2.5K0
linux上找到可用的网络接口
在 Linux 中查找可用的网络接口 我们可以通过几种方式找到可用的网卡。在本指南中,我们将讨论列出 Linux 中网络接口卡的 10 种方法。 1. 使用 ifconfig 命令列出网络接口 使用ifconfig命令查找网络接口详细信息的最常用方法。我相信一些 Linux 用户可能仍在使用它。 $ ifconfig -a enp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 24:b6:fd:37:8b:29 txqueuelen 1000 (Eth
入门笔记
2022/06/02
2.4K0
无法为 WSDD 操作找到匹配的 Java 操作
我发现了错误。 只需要把“AndrQues”改成“andrQues”,程序就可以正常运行了。
matinal
2023/10/13
1960
Ajax请求($.ajax())中data属性传参数的形式
实现Ajax提交数据进行请求,其中data属性设置传参的方法有好几种形式,如下: //第一种写法(把参数拼接在URL中,data属性设为空{ })
PM吃瓜
2019/08/12
3.9K0
点击加载更多

相似问题

而网络报废这个错误显示是不可接受的!无法在此服务器上找到所请求资源的适当表示形式。

19

无法接受在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的

116

在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的。

33

Django -未找到在此服务器上找不到请求的资源

146

获取此错误:源服务器未找到目标资源的当前表示形式,或不愿透露存在此表示形式。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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