c++ - 编译器怎么知道不从锁定/解锁内部优化语句?在 C++ 中使用 boost::spinlocks

标签 c++ multithreading boost locking compare-and-swap

具有两个重载 operator() 函数的类从不同的线程调用。请参阅下面代码中的//注释。

优化器是否知道不要将 entryadd = mSpread * ENTRY_MULTIPLIER 移动到 lock() 之上?

struct Algo1
{   
    boost::detail::spinlock mSpreadLock;

    Algo1() : mSpreadLock() {}

    //called from thread 1 
    inline void operator()(const indata &signal) 
    {
        if ( signal.action() == SEND )
        {
            double entryadd;
            mSpreadLock.lock();
            entryadd = mSpread * ENTRY_MULTIPLIER; //isnt it possible for compiler to optimize this before the lock? 
            mSpreadLock.unlock();
            FunctionCall(entryadd);
        }
    }

    //called from thread2
    inline void operator()(const indata2 &bospread) 
    {
        boost::detail::spinlock::scoped_lock mylock(mSpreadLock);
        mSpread = bospread.spread();
    }
}

这个呢?

{
    mSpreadLock.lock();
    double entryadd = mSpread * ENTRY_MULTIPLIER; 
    mSpreadLock.unlock();
{

entryadd me 的定义会移到函数顶部吗?

除非我遗漏了什么.. 似乎代码块内的锁定和解锁不起作用。必须使用 scoped_lock。 boost::detail::spinlock::scoped_lock mylock(mSpreadLock) ,它将在函数调用期间锁定。

当然我可以像这样破解它:(但效率较低)

inline void operator()(const indata &signal) 
{
    if ( signal.action() == SEND )
    {
        double entryadd;
        {
            boost::detail::spinlock::scoped_lock mylock(mSpreadLock);
            entryadd = mSpread * ENTRY_MULTIPLIER; 
        }
        FunctionCall(entryadd);
    }
}

最佳答案

锁定操作最终将使用编译器内置函数来执行某种类型的原子操作。编译器知道这些操作不能重新排序,也不会优化“过去”它们。一切都很好。

关于c++ - 编译器怎么知道不从锁定/解锁内部优化语句?在 C++ 中使用 boost::spinlocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940193/

相关文章:

c++ - 将 .txt 中的数据输入结构数组

javascript - 如何同时发布多个axios请求?

Python -> Boost Python + C++ 错误

c++ - 从终端编译框架(cppunit、boost、++)以使用 Xcode 4.6

c++ - 使用带有 `make check` 的 Boost 单元测试框架 (UTF)

c++ - 如何使用具有指向参数的数组指针的方法?

c++ - 使用 constexpr 编译时间哈希

c++ - 在 C++ 中使用 OpenCV 检测剪贴画或 vector 图像

Java : ReentrantReadWriteLock with priority

c - 是否可以使用相同的静态void函数在c中使用多个线程?