是否有一些竞争条件只能通过真正的并发发生?

时间:2017-06-24 21:35:00

标签: multithreading language-agnostic

如果您的计算机只有一个核心,那么使用线程代码就可以轻松解决各种问题。例如,你有:

A

然后线程1可以超过第一个增量然后被换出,而另一个线程会看到function get_notice($output) { if (($noticeStartPoint = strpos($output, "<b>Notice</b>:")) !== false) { $position = $noticeStartPoint; for ($i = 0; $i < 3; $i++) $position = strpos($output, "</b>", $position) + 1; $noticeEndPoint = $position; $noticeLength = $noticeEndPoint + 3 - $noticeStartPoint; $noticeMessage = substr($output, $noticeStartPoint, $noticeLength); throw new \Exception($noticeMessage); } else echo $output; } try { ob_start(); // Codes here $codeOutput = ob_get_clean(); get_notice($codeOutput); } catch (\Exception $exception) { // Catch (notice also)! } 违反了一个不变量。

然而,我对这个问题很感兴趣,是否存在一些竞争条件或并发错误,这些错误仅在具有真正parralelism的架构上表现出来,即两个或多个线程在同一物理时间执行?

1 个答案:

答案 0 :(得分:3)

要查找的关键字是内存屏障内存模型(或更通用的术语 - 一致性模型)。简而言之,当线程在单个核心上切换时,每个线程都会看到相同的读写顺序。如果存在具有不同内容的不同内核/ CPU,则读取和写入的顺序对于它们中的每一个可能看起来不同。一旦算法依赖于内存访问顺序,使用它的程序就会在多核/多CPU机器上出现故障,但在单核机器上永远不会失败。