线程 - 争用与种族



我已经看到术语contentionrace在线程状态(在关键部分(时可以互换使用。它们是一样的吗?

"争用"通常是指两个或多个线程需要锁定同一锁的情况。我们说锁是"有争议的",或者可能是"严重竞争的",如果任何线程在尝试获取锁时被迫等待的可能性很大。

">

种族"、"竞争条件"和"数据竞赛"是含义随时间变化的短语,对于使用不同编程语言的人来说可能具有不同的含义。每当有人使用这些单词/短语之一时,请确保您了解他们如何使用它。

"争用"以最一般的方式描述了某些操作的结果取决于线程调度方式的情况。如果每个可能的结果都是可接受的结果,那么比赛可能是良性的。例如,如果两个或多个线程竞相获取锁,并且某些内容写入文件的顺序取决于哪个线程首先到达那里,但没有人关心顺序......

*但*

...现在,一些程序员使用"竞争条件"和"数据竞争"来描述当由现代优化编译器编译并在现代多处理器硬件上运行的多线程代码在没有某种保护的情况下访问共享变量时可能发生的众多细微问题中的任何一个。

即使线程正在"竞相"访问一些不受保护的共享变量并不明显,它仍然可能是糟糕的,并且以十年或更长时间前不存在的方式变得糟糕。

如果你正在编写C++程序,C++语言标准处理它,简单地说,任何对没有保护的共享变量的访问都是"数据竞争",任何数据竞争都是"未定义的行为",如果你的程序调用未定义的行为,那么它是错误的!不管它是否碰巧对你有用,这是错误的,这是你的错,如果你把它运送给一个客户,六个月后客户起诉你,因为他们升级了他们的操作系统,他们的整个电子商务系统都去了****,那么这都是你的错,因为......"数据竞赛。">


* 我说的是互斥锁和/或Atomic<foobar>数据类型。

** 当心旧教科书中的建议和例子。

最新更新