C ++使用互斥字段初始化结构

C++ Initialize struct with mutex field

我正在尝试弄清楚如何使用互斥字段初始化结构,因为互斥类型在 C++ 中不可复制或移动。

我有结构:

typedef struct sample {
  int field1;
  std::mutex mtx;
} sample_t;

我正在尝试以下列方式初始化它,但我不断收到错误消息:使用已删除的函数。我对 C++ 不是很熟悉,希望得到一些帮助!

sample_t* new_sample;
std::mutex a_mtx;
// new_sample->mtx = std::move(a_mtx); (I tried this too)
new_sample->mtx = a_mtx;
new_sample->mtx.lock();
new_sample->field1 = 2;
new_sample->mtx.unlock();

Mutex 不可复制且不可移动。但是你不需要这两个操作,你只需要创建 sample_t 对象 - std::mutex 里面会被编译器初始化。

sample_t new_sample;

new_sample.mtx.lock();
new_sample.field1 = 2;
new_sample.mtx.unlock();

或者,如果您出于某种原因确实需要指针:

// sample_t* new_sample = new sample_t;
// you should prefer smart pointers over raw pointers
std::unique_ptr<sample_t> new_sample = std::make_unique<sample_t>();

new_sample->mtx.lock();
new_sample->field1 = 2;
new_sample->mtx.unlock();

正如@JarMan 在评论中指出的那样,在 C++ 中,结构的所有字段都是在创建结构时初始化的。你得到的关于“使用已删除函数”的错误告诉你,一旦结构存在,你不能只复制已经存在的互斥量。

但是,您确实需要实际创建结构;您拥有的代码创建了一个指针,但并未创建结构本身。所以你可能想要:

sample_t* new_sample = new sample_t;
new_sample->mtx.lock();
// ... etc

此外,请注意,在 C++ 中,声明结构时不必执行 typedef;你可以做

struct sample_t {
  int field1;
  std::mutex mtx;
};