c – 返回对象值时的互斥锁

前端之家收集整理的这篇文章主要介绍了c – 返回对象值时的互斥锁前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我理解C编译器如何处理局部变量,那么IsShutdownInProgress()不需要任何锁定,因为shutdownInProgress静态变量将被放置在堆栈上.我对么?
  1. class MyClass
  2. {
  3. private:
  4. // Irrelevant code commented away
  5. static pthread_mutex_t mutex;
  6. static bool shutdownInProgress;
  7. public:
  8. static void ShutdownIsInProgress()
  9. {
  10. pthread_mutex_lock(mutex);
  11. shutdownInProgress = true;
  12. pthread_mutex_unlock(mutex);
  13. }
  14.  
  15. static bool IsShutdownInProgress()
  16. {
  17. // pthread_mutex_lock(mutex);
  18. // pthread_mutex_unlock(mutex);
  19. return shutdownInProgress;
  20. }
  21. }

解决方法

Am I correct?

不会.这会将其复制回来;但读取它以使该副本不同步将导致数据竞争,具有未定义的行为.您需要在锁定互斥锁的情况下制作本地副本:

  1. static bool IsShutdownInProgress()
  2. {
  3. pthread_mutex_lock(mutex);
  4. bool result = shutdownInProgress;
  5. pthread_mutex_unlock(mutex);
  6. return result;
  7. }

或者,使用不易出错的RAII锁定类型:

  1. static bool IsShutdownInProgress()
  2. {
  3. lock_guard lock(mutex);
  4. return shutdownInProgress;
  5. }

在C 11中,您可以考虑使用std :: atomic< bool>为了更方便,也许更有效,从多个线程访问简单类型.

猜你在找的C&C++相关文章