为了账号安全,请及时绑定邮箱和手机立即绑定

请问这里把mutex作为类的成员变量为什么就不行呢?应当如何修改?

请问这里把mutex作为类的成员变量为什么就不行呢?应当如何修改?

C++
慕标琳琳 2023-03-03 14:10:48
只是一段模拟多个售票点同时卖票的演示程序,代码如下class TicketShop{char name;static int remains;mutex myMutex;public:TicketShop(char n){ name = n; }void sell();};int TicketShop::remains = 100;void TicketShop::sell(){while (1){myMutex.lock();if (remains > 0){remains--;cout << remains << "\t" << name << endl; }else{myMutex.unlock();break;}myMutex.unlock();}}结果编译时报错,说error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function发现如果把第五行mutex myMutex 的生命移到类外,即改成全局变量,就没有这个问题。
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超8个赞

是你构造TicketShop对象的地方,可能是你的主函数里,你没贴出来,可能是写了类似:


TicketShop s1;TicketShop s2 = s1;

这样的代码,而你的TicketShop类使用默认的拷贝构造函数,导致上面代码第二句构造s2时会调用mutex的拷贝构造函数,而mutex的拷贝构造函数是=delete的,也就是不允许拷贝构造,所以编译报错

当你改成全局的mutex声明时,拷贝构造TicketShop对象不会引发mutex对象的拷贝构造,所以就没问题。


查看完整回答
反对 回复 2023-03-06
?
阿晨1998

TA贡献2037条经验 获得超6个赞

这和mutex没直接关系,你只是触发对已经删除的函数的调用了。比如mutex的operator=

查看完整回答
反对 回复 2023-03-06
  • 2 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号