c++ - 多线程类中互斥体可能出现段错误

标签 c++ c++11 thread-safety segmentation-fault mutex

当多个线程(std::async)通过shared_ptr共享以下类的实例时,是否有可能在这部分出现段错误代码?如果我对 std::mutex 的理解是正确的,则 mutex.lock() 会导致所有其他线程尝试调用 mutex.lock() 来阻塞直到调用 mutex.unlock() ,因此对 vector 的访问应该完全按顺序发生。我在这里错过了什么吗?如果没有,是否有更好的方法来设计这样的类(也许使用 std::atomic_flag)?

#include <mutex>
#include <vector>
class Foo
{
   private:
      std::mutex mutex;
      std::vector<int> values;
   public:
      Foo();
      void add(const int);
      int get();
};
Foo::Foo() : mutex(), values() {}
void Foo::add(const int value)
{
   mutex.lock();
   values.push_back(value);
   mutex.unlock();
}
int Foo::get()
{
   mutex.lock();
   int value;
   if ( values.size() > 0 )
   {
      value = values.back();
      values.pop_back();
   }
   else
   {
      value = 0;
   }
   mutex.unlock();
   return value;
}

免责声明:get() 中的默认值 0 是有意为之的,因为它在代码的其余部分中具有特殊含义。

更新:上面的代码与我使用的完全一样,当然除了拼写错误push_Back。

最佳答案

除了不使用 RAII 获取锁并使用 size() > 0 而不是 !empty() 之外,代码看起来不错。这正是互斥体的用途,也是如何以及在何处需要互斥体的典型示例。

正如 Andy Prowl 指出的那样,实例不能被复制构造或复制分配。

关于c++ - 多线程类中互斥体可能出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14834060/

相关文章:

c++ - 这个 boost::tuple 代码可以转换为纯 std::standard 库代码吗?

c++ - 模板类型的成员枚举类作为函数参数

c# - ThreadPool.QueueUserWorkItem 是线程安全的吗?

java - 是否可以停止某个线程的运行?

c++ - 在 C++ 中获取 IP 地址的独立于平台的方法

c++ - decltype 和隐藏外部名称的类成员名称之间的交互

C++ Opencv 不同分辨率相机标定

c++ - 为什么这个循环不加载正确的事件?

c++ - 无法将超过 256 个节点插入到自定义树中

Java:每隔几秒创建一次文件