竞争条件的定义:种族条件或种族危险是系统或过程中的缺陷,其中过程的输出或结果意外和关键依赖于其他事件的顺序或时间.

考虑以下伪代码:

Global variable i initialized to 6;
    Thread 1: 
        acquire(lock l)
        increment global variable i,i.e. i++;

    Thread 2: 
       acquire(lock l)
       double the value of global var i,i.e.: i*=2;

如果T1首先获得锁定l并且T2秒,则i的值将为14.另一方面,如果T2首先获取锁定l并且T1获得第i个值,则i的值将为13.

那么这是不是竞争条件呢?

更新:经过多次意见和回答,意见仍然分歧.我的意见是在“是的,这是种族条件”类别.其实我把这个例子作为一个种族条件的情况,在另一个问题上.
同时,我也在“不,不是竞赛条件”类别中阅读一些有趣的评论.
我想我会根据观察这个问题的角度/层次来确定和定论这是或不是竞争条件.
不过,我还在等待有趣的答案/评论.

解决方法

我认为示例算法是否具有竞争条件取决于算法预期做什么.

对于i的修改没有数据竞争 – 这些访问被序列化并且相对于彼此原子地发生.

然而,如果算法的正确性对增量在乘法(或反之亦然)之前发生)的正确性是重要的,则存在竞争,并且必须使用其他手段来同步算法的执行.如果算法是一个复杂的方法来计算i * 2 1(可能是使用线程执行计算可笑),那么就有一个竞争条件.

请考虑以下程序代码段:

int data;

pthread_cond_t condvar = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mux = PTHREAD_MUTEX_INITIALIZER;

void* wait_for_data(void*)
{
    pthread_mutex_lock( &mux);
    pthread_cond_wait( &condvar,&mux);

    puts("got the data: %d\n",data);

    pthread_mutex_unlock( &mux);

    return 0;
}


void* set_data(void*)
{
    pthread_mutex_lock( &mux);

    data = 42;

    pthread_cond_signal( &condvar);

    pthread_mutex_unlock( &mux);

    return 0;
}

两个线程本质上完全相互排斥 – 没有数据竞争.但是,如果set_data()在wait_for_data()等待之前发送条件变量,wait_for_data()将永远不会完成.我认为大多数人会因为使用条件变量而被称为竞争条件.

多线程 – 这是竞争条件吗?的更多相关文章

  1. iOS:核心图像和多线程应用程序

    我试图以最有效的方式运行一些核心图像过滤器.试图避免内存警告和崩溃,这是我在渲染大图像时得到的.我正在看Apple的核心图像编程指南.关于多线程,它说:“每个线程必须创建自己的CIFilter对象.否则,你的应用程序可能会出现意外行为.”这是什么意思?我实际上是试图在后台线程上运行我的过滤器,所以我可以在主线程上运行HUD(见下文).这在coreImage的上下文中是否有意义?

  2. ios – 尝试修复崩溃:QuartzCore – CA :: release_objects(X :: List *)

    我们的应用程序遇到了几次崩溃,想知道您是否有任何见解或有过类似的经历.我已经分享了下面的崩溃日志信息.运行iOS8.1.我们已经通过仪器,静态分析仪运行它,并且仍在努力指出问题.解决方法这里的问题是你在CoreAnimation没有预料到的对象上做了一个额外的发布,所以问题在你的代码中引入,但是当动画框架进行清理阶段时会暴露出来.要解决此问题,请使用性能分析.选择Allocationsprofil

  3. ios – 意外的核心数据多线程违规

    我正在使用苹果的并发核心数据调试器.-com.apple.CoreData.ConcurrencyDebug1有时候我得到__Multithreading_Violation_AllThatIsLeftToUsIsHonor__,即使我几乎肯定线程没有被违反.这是发生异常的代码的一部分(代码是扩展NSManagedobject的协议的一部分):代码在上下文的执行:块中执行.这里是线程信息:和调试器

  4. ios – “只在主线程上运行”异常是模拟器

    我得到一个“只运行在主线程”异常深处(或之后)事情只发生在模拟器上,而不是在IOS设备中进行调试.有什么机会我可以解决这个问题吗?

  5. ios – gpus_ReturnNotPermittedKillClient中有很多崩溃

    有没有办法解决或避免这个?

  6. ios – UIGraphicsBeginImageContextWithOptions和多线程

    我对UIGraphicsBeginImageContextWithOptions和线程有点困惑,因为根据UIKitFunctionReferenceUIGraphicsBeginImageContextWithOptions应该只在主线程上调用.当被调用时,它创建一个基于位图的上下文,可以使用CoreGraphics的函数或者像-drawInRect这样的方法来处理:对于UIImage,-draw

  7. ios – XCode 5.x Maverick在文件操作时崩溃

    tstart=0显然,.DS_Store文件让XCode感到困惑,删除所有这些文件似乎解决了这个问题.从粗略分析看来,问题只是由操作系统的早期版本创建的.DS_Store文件生成,因为新版本似乎没有触发问题像我这样想要在桌面上特定位置使用图标的人……)问题,我在我的系统上安装了一个单行脚本来清理所有.DS_Store文件的目录:我在XCode访问的目录上定期运行它,以便解决问题.

  8. ios – 异常类型:EXC_CRASH(SIGABRT)

    有没有人知道这次崩溃?解决方法这不是崩溃,因异常而中止.这意味着您的应用程序正在将错误数据传递给系统例程,并且例程说它很糟糕且无法继续,因此它会杀死您的应用程序.控制台应该显示出错的地方.可能发生的一个常见异常是尝试从一个只有n个对象的数组中获取第一个对象.控制台将显示一条消息.因此,请检查控制台以查看可能发生的情况.

  9. 用Swift实现MD5算法&引入第三方类库MBProgressHUD

    之前项目里面是用objc写的MD5加密算法,最近在用swift重写以前的项目,遇到了这个问题。顺带解决掉的还有如何引入第三方的类库,例如MBProgressHUD等一些特别好的控件解决的方法其实是用objc和swift混合编程的方法,利用Bridging-header文件。你可以简单的理解为在一个用swift语言开发的工程中,引入objective-c文件是需要做的一个串联文件,好比架设了一个桥,让swift中也可以调用objective-c的类库和frame等等。

  10. swift排序算法和数据结构

    vararrayNumber:[Int]=[2,4,216)">6,216)">7,216)">3,216)">8,216)">1]//冒泡排序funcmaopao->[Int]{forvari=0;i

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部