Нашел на хабре пример deadlock-а:
template
void threadFunction(container
int main()
{
srand((unsigned int)time(0));
container
Правильно ли я понимаю, что дедлок возникает из-за того что в одном и том же потоке вызывается addrange в котором сначала идет _lock.lock() а затем add в которой опять идет _lock.lock()? если да, то почему в следующем примере нету дедлока(слегка измененный в худшую сторону пример из книги Энтони Уильямса, где я специально unlock() не сделал):
struct Y {
private:
mutable std::mutex m;
int data;
int get_data() const {
m.lock();
return data;
}
public:
Y(int&& data_) : data(std::move(data_)) {}
friend bool operator==(Y const& lhs, Y const& rhs) {
if(&lhs==&rhs)
return true;
auto lhs_ = lhs.get_data();
auto rhs_ = rhs.get_data();
return (lhs_==rhs_);
}
};
int main() {
Y y1(1); Y y2(2);
std::cout<<(y1==y2)<
Ответ
По стандарту поведение для повторного вызова std::mutex::lock в одном потоке для одного и того же std::mutex не определено:
If lock is called by a thread that already owns the mutex, the
behavior is undefined: for example, the program may deadlock.
В том числе, может возникнуть deadlock. В конкретной реализации, например в VS2015, в этом случае возникает исключение.
Ваш второй пример вызывает метод std::mutex::lock у разных объектов std::mutex, поэтому описанный выше эффект не возникает.
Комментариев нет:
Отправить комментарий