主题--竞争与竞赛
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主题--竞争与竞赛相关的知识,希望对你有一定的参考价值。
我见过的术语有 contention
和 race
谈到线程的状态(在临界部分)时,它们可以互换使用。它们是一样的吗?
"争夺 "通常指的是两个或多个线程需要锁定同一个锁的情况。如果任何一个线程在试图获取锁的时候,有相当大的概率被迫等待,我们就说这个锁是 "争夺 "的,或者说是 "严重争夺 "的。
"Race"、"Race condition "和 "Data race "这些短语的含义随着时间的推移而改变,对于使用不同编程语言的人来说,它们可能有不同的含义。任何时候有人使用这些词组之一时,请确保你理解他们是如何使用它的。
"赛跑",用最一般的方式来描述一些操作的结果取决于线程如何调度的情况。如果每一个可能的结果都是可以接受的结果,那么竞赛可能是良性的。例如,如果两个或更多的线程竞相获取一个锁,而某些东西写入文件的顺序取决于哪个线程先到,但没有人关心这个顺序......。
*但是
...... "竞赛条件 "和 "数据竞赛 "现在被一些程序员用来描述由现代优化编译器编译并在现代多处理器硬件上运行的多线程代码在没有某种保护的情况下访问共享变量时可能出现的众多微妙问题。
即使线程 "竞相 "访问某个未受保护的共享变量并不明显,它仍然可能是坏的,而且坏的方式是十年或更久之前不存在的**,我无法一一列举。
如果你在写C++程序,C++语言标准对它的处理方式只是说 任何 在没有保护的情况下对共享变量的访问是 "数据竞赛",而任何数据竞赛都是 "未定义行为",如果你的程序调用了未定义行为,那么它就是错误的! 不管它是否碰巧对你有用,它都是错的,它错了就是你的错,如果你把它运给客户,六个月后客户起诉你,因为他们升级了他们的操作系统,他们的整个电子商务系统变成了***,那么这都是你的错,因为... "数据竞赛"
* 我说的是mutex锁,或者说... Atomic<foobar>
数据类型。
** 小心来自旧教科书的建议和例子。
以上是关于主题--竞争与竞赛的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题