考虑2个进程在unicore和多核处理器中运行以下代码。
// Assume this address is legal address for both the process
int *sharedmemoryaddress = 0x1232;
void SomeRunningFunction()
{
for(int i = 1; i < 1000; ++i)
{
*sharedmemoryaddress = i;
sleep(2000);
}
}
对于unicore睡眠可能是一种在代码中提供互斥性的方法(但不是必需的),因为此代码将被交错,因为睡眠持续时间很长。 unicore中的失败场景可能是在非原子的赋值运算符中,在这种情况下可能存在数据争用。
在多核中存在竞争条件的高概率,因为代码的执行可以在不同的核心中并行完成。
这个解释是否正确?除了非原子赋值运算符之外,有没有什么方法可以在unicore中进行数据竞争。
除此之外:现代操作系统是否为每个核心都有多个可运行和等待队列?
答案 0 :(得分:0)
除了非原子赋值运算符之外,是否有任何方法可以在unicore中进行数据竞争。
不确定。 CPU可能具有一些尚不存在的功能,可以完美地模拟多核CPU。
不,好。&#34;问题在于没有人足够聪明地想到代码在今天和未来都会失败的每种可能方式。
我可以从几十年的经验告诉你,由于这种推理,我已经看过几十次代码失败了。有时在它制造的那一刻它是错的。有时代码会发生数周或数月的工作,直到新的CPU,编译器或库导致它失败。
相关标准为您提供担保,或者它没有。
唯一的例外是偶尔的情况(例如Windows线程),其中平台的指定非常糟糕,你只能猜测。
更为明显的是,编译器可以将函数优化为:
void SomeRunningFunction()
{
for(int i = 1; i < 1000; ++i)
{
sleep(2000);
}
*sharedMemoryAddress = 9999;
}