小编Pet*_*ham的帖子

自旋锁真的需要DMB吗?

我正在使用双Cortex-A9系统,我一直在努力理解为什么自旋锁功能需要使用DMB.似乎只要刷新合并存储缓冲区,锁定值应该在解锁核心的L1中结束,并且SCU应该使另一个核心的L1中的值无效或更新.这足以保持一致性和安全锁定吗?并且STREX不会跳过合并存储缓冲区,这意味着我们甚至不需要刷新?

DMB似乎是一种生硬的东西,特别是因为它默认为系统域,这可能意味着一直写入主内存,这可能很昂贵.

锁定中的DMB是不是正确使用smp_mb的驱动程序的解决方法吗?

我目前看到,基于性能计数器,我的系统周期中约有5%在由DMB引起的停顿中消失.

linux synchronization arm locking memory-barriers

6
推荐指数
1
解决办法
639
查看次数

使用可变参数模板时出现意外的隐式转换?

鉴于此代码:

#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)

c++ casting implicit-conversion variadic-templates c++11

5
推荐指数
1
解决办法
477
查看次数

这段代码线程安全吗?如果不是何时以及如何出错?

好的,所以我被告知这段代码不是线程安全的.

#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)

c++ multithreading

3
推荐指数
1
解决办法
176
查看次数