如果您的计算机只有一个核心,那么使用线程代码就可以轻松解决各种问题。例如,你有:
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的架构上表现出来,即两个或多个线程在同一物理时间执行?
答案 0 :(得分:3)
要查找的关键字是内存屏障和内存模型(或更通用的术语 - 一致性模型)。简而言之,当线程在单个核心上切换时,每个线程都会看到相同的读写顺序。如果存在具有不同内容的不同内核/ CPU,则读取和写入的顺序对于它们中的每一个可能看起来不同。一旦算法依赖于内存访问顺序,使用它的程序就会在多核/多CPU机器上出现故障,但在单核机器上永远不会失败。