我正在使用双Cortex-A9系统,我一直在努力理解为什么自旋锁功能需要使用DMB.似乎只要刷新合并存储缓冲区,锁定值应该在解锁核心的L1中结束,并且SCU应该使另一个核心的L1中的值无效或更新.这足以保持一致性和安全锁定吗?并且STREX不会跳过合并存储缓冲区,这意味着我们甚至不需要刷新?
DMB似乎是一种生硬的东西,特别是因为它默认为系统域,这可能意味着一直写入主内存,这可能很昂贵.
锁定中的DMB是不是正确使用smp_mb的驱动程序的解决方法吗?
我目前看到,基于性能计数器,我的系统周期中约有5%在由DMB引起的停顿中消失.
鉴于此代码:
#include <iostream>
template<typename... Args> class X;
template<typename T>
class X<T> {
public:
T value;
X(T value_) : value(value_) {}
};
template<typename T, typename... Args>
class X<T, Args...> : public X<Args...> {
public:
T value;
X(T value_, Args... args) : value(value_), X<Args...>(args...) {}
};
template<typename T>
std::ostream& operator <<(std::ostream& stream, const X<T>& value_) {
stream << value_.value;
return stream;
}
template<typename T, typename... Args>
std::ostream& operator <<(std::ostream& stream, const X<T, Args...>& value_) {
stream << value_.value << " " << …Run Code Online (Sandbox Code Playgroud) 好的,所以我被告知这段代码不是线程安全的.
#include <iostream>
#include <thread>
static int sum[5];
static int get_sum()
{
int x=0;
for (int j=0;j<5;++j)
x += sum[j];
return x;
}
static void f1(int x){
sum[x] = 1;
std::cout << "f" <<x << ": " << sum[x] << " : " << get_sum() << std::endl;
}
int main() {
for (int j=0;j<5;++j)
sum[j] = 0;
std::thread t0(f1, 0);
std::thread t1(f1, 1);
std::thread t2(f1, 2);
std::thread t3(f1, 3);
std::thread t4(f1, 4);
while (get_sum() != 5) ;
t0.join();
t1.join();
t2.join(); …Run Code Online (Sandbox Code Playgroud)