c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?

c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?,第1张

概述假设我有以下功能. std::mutex mutex;int getNumber(){ mutex.lock(); int size = someVector.size(); mutex.unlock(); return size;} 这是一个在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,会返回值优化还是别的东西会破坏这段代码 假设我有以下功能.
std::mutex mutex;int getNumber(){    mutex.lock();    int size = someVector.size();    mutex.unlock();    return size;}

这是一个在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,会返回值优化还是别的东西会破坏这段代码? someVector的大小可以从程序拥有的众多线程中的任何一个更改,并且假设只有一个线程(修饰符除外)调用getNumber().

解决方法 您没有提到互斥变量的类型是什么,但假设它是一个std :: mutex(或类似的东西意味着保证互斥),编译器将无法执行大量优化.因此,您无需担心返回值优化或其他一些优化,从而允许在互斥块之外执行size()查询.

但是,只要释放互斥锁,另一个等待线程就可以自由访问该向量并可能使其变异,从而改变大小.现在,您的函数返回的数字已过时.正如Mats PeteRSSon在他的answer中提到的,如果这是一个问题,则需要getNumber()的调用者获取互斥锁,并保持直到调用者使用结果完成.这将确保矢量的大小在 *** 作期间不会改变.

对于涉及异常,多个返回语句等更复杂的函数,显式调用mutex :: lock后跟mutex :: unlock很快变得不可行.更容易的替代方法是使用std :: lock_guard来获取互斥锁.

int getNumber(){    std::lock_guard<std::mutex> l(mutex); // lock is acquired    int size = someVector.size();    return size;} // lock is released automatically when l goes out of scope
总结

以上是内存溢出为你收集整理的c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?全部内容,希望文章能够帮你解决c – 如果我在互斥锁之间声明一个变量并返回它,我是否需要使用volatile关键字?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存