【发布时间】:2021-01-05 18:22:39
【问题描述】:
我试图弄清楚如何使用互斥体字段初始化结构,因为互斥体类型在 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();
【问题讨论】:
-
你到底想做什么?为什么您认为需要将一个默认创建的互斥锁的值复制到另一个默认创建的互斥锁?你认为那有什么作用?你认为
mutex1=mutex2;会以某种方式使任何持有mutex2的线程现在持有mutex1? -
根本不需要初始化。您已经拥有一个完整构造的 std::mutex 实例。你可以摆脱
a_mtx,直接打电话给lock()。 -
当我摆脱
a_mtx时,我会在new_sample->mtx.lock()行出现段错误。如果我在 gdb 中打印出 new_sample,它看起来像$1 = (new_sample *) 0x0所以我认为我需要初始化它? -
@MaryMatthews 您需要初始化
sample_t对象,而不是它的成员。你的指针没有指向任何地方。 -
段错误是因为
new_sample是一个未初始化的指针。您可以使用sample_t* new_sample = new sample_t;或根本不使用指针:sample_t new_sample;
标签: c++ multithreading struct syntax mutex