C++ 编译器如何知道不从lock/unlock内部优化语句?在c++;

C++ 编译器如何知道不从lock/unlock内部优化语句?在c++;,c++,multithreading,boost,locking,compare-and-swap,C++,Multithreading,Boost,Locking,Compare And Swap,使用两个重载的operator()函数从单独的线程调用。请参阅下面代码中的//注释 优化器是否知道不要将entryadd=mSpread*ENTRY\u乘数移动到lock()上方 这个怎么样 { mSpreadLock.lock(); double entryadd = mSpread * ENTRY_MULTIPLIER; mSpreadLock.unlock(); { entryaddme的定义会移到函数的顶部吗 除非我遗漏了什么。。似乎代码块中的锁定和解锁将不起

使用两个重载的
operator()
函数从单独的线程调用。请参阅下面代码中的//注释

优化器是否知道不要将
entryadd=mSpread*ENTRY\u乘数移动到
lock()
上方

这个怎么样

{
    mSpreadLock.lock();
    double entryadd = mSpread * ENTRY_MULTIPLIER; 
    mSpreadLock.unlock();
{
entryadd
me的定义会移到函数的顶部吗

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

当然我可以这样处理:(但效率较低)


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

你是说
boost::detail::spinlock::scoped_lock mylock(mSpreadLock)处于中间位置的函数只会从此点锁定,直到它超出范围?所以没有必要把它放在自己的块里?正确。这里的关键词是“屏障”-锁定代码使用它们(通常通过编译器内部函数),编译器知道不要通过它们重新排列相关指令。因此,当您获取锁(即声明mylock)并持续到释放它(mylock超出范围)时,效果才会生效。如果编译器无法判断给定函数的功能(例如,对定义位于不同TU中的函数的调用),则必须将其视为包含完整内存屏障,以防万一。所以锁定操作并没有什么特别神奇的,实际上很多调用都是这样处理的。如果编译器意识到没有障碍,它就可以执行许多重新排序。链路时间优化提供了更多实现这些目标的机会,至少在理论上是如此。
{
    mSpreadLock.lock();
    double entryadd = mSpread * ENTRY_MULTIPLIER; 
    mSpreadLock.unlock();
{
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);
    }
}