You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Вот тут выполняется первая лямбда. А вот здесь её результат будет передан второй лямбде. При этом первая ещё не разрушена, это происходит выше по стеку (при разрушении вот этой лямбды). Значит resource1 всё ещё цел. Это неочевидное поведение, которое может привести к дедлоку, если get_resource не может отдать результат, пока жив resource1, или гонке, если вторая лямбда должна исполняться на другом потоке, а get_resource отдаёт общий ресурс.
Вот такое решение в portable_concurrency/bits/utils.h исправляет поведение и делает его более ожидаемым:
Фактически ты хочешь гарантии что результат который вернула функция отданая в then/next не будет использован до разрушения самой функции. Попробую накидать тестов на такое поведение вместе с реализацией.
Внутри set_state_value может не получиться обеспечить подобной гарантии, так как там f передан по perfect-forward ссылке, а владеет им кто-то снаружи. Если владелец отдаёт константный объект, то move не будет иметь эффекта. Так что правильная реализация потребует чуть большего количества правок.
Привет.
Столкнулся с гонкой при обработке цепочки continuations.
Упрощённый пример:
Вот тут выполняется первая лямбда. А вот здесь её результат будет передан второй лямбде. При этом первая ещё не разрушена, это происходит выше по стеку (при разрушении вот этой лямбды). Значит
resource1
всё ещё цел. Это неочевидное поведение, которое может привести к дедлоку, еслиget_resource
не может отдать результат, пока живresource1
, или гонке, если вторая лямбда должна исполняться на другом потоке, аget_resource
отдаёт общий ресурс.Вот такое решение в
portable_concurrency/bits/utils.h
исправляет поведение и делает его более ожидаемым:The text was updated successfully, but these errors were encountered: