亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問這里把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 關注
  • 184 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號