tôi có chức năng thành viên sau đây:Khi được các nhà xây dựng bản sao cho giá trị trả về sẽ xảy ra
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex
là một lớp helper mà recieves một mutex và khóa nó trong các nhà xây dựng và phát hành trong destructor.
m_person
thuộc loại Person
(thứ gì đó rất nhỏ). Các chức năng khác trong các chủ đề khác có thể thay đổi thành viên này.
Tôi muốn trả lại m_person
theo giá trị (trả lại bản sao) và dĩ nhiên tôi muốn tránh tình huống trong đó m_person
bị thay đổi trong chuỗi khác trong khi nó đang được sao chép trong khi trả lại.
Nhưng điều gì xảy ra trước? Trình biên dịch đầu tiên có tạo ra một bản sao của m_person
hoặc lần đầu tiên gọi hàm hủy của myLock
?
Về mặt lý thuyết nó có thể giải quyết easly bằng cách làm một cái gì đó như thế này:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
Nhưng tôi muốn biết câu trả lời cho câu hỏi của tôi.
Cảm ơn
[OT] Bạn có thể thay thế 'RAIIMutex' với [' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver
Các nhà xây dựng bản sao có thể không được gọi ở tất cả, do [copy elision] (https://en.wikipedia.org/wiki/Copy_elision). –
@JoachimPileborg Đó là nghi ngờ như 'm_person' dường như là một biến thành viên lớp. – NathanOliver