@guaranteed
не является атрибутом, который доступен для использования в Swift себя, это на самом деле SIL (Swift Intermediate Language) атрибут - который определяет соглашение управления памятью параметров функции.
The three possible conventions для передачи параметров являются:
бесхозного - Ни вызывающие или вызываемый абонент утверждает, владение переданного значения, но это гарантировано будет действительным в момент вызова (если не вызываемый делает что-то, чтобы сделать это недействительным).
принадлежит - Указ имеет право собственности на стоимость. Вызывающий абонент сохранит значение перед его передачей, а затем ответственное лицо освободит его после его выполнения.
Гарантировано - Абонент заявляет права собственности на стоимость, позволяя вызываемому иметь гарантию того, что он будет действителен во время разговора.
В посте вы упоминаете, sync(mutex:execute:)
изначально определяется как глобальная функция, которая (AFAIK) по умолчанию будет использовать конвенцию принадлежит для его параметров. Поэтому значение, переданное параметру mutex
, будет сохранено вызывающим абонентом перед передачей функции, которое затем будет выпущено после его завершения.
Однако эти служебные данные для сохранения/освобождения для условного соглашения не нужны, если значение, переданное функции, имеет продолжительность жизни, которая выходит за пределы вызова функции, что, скорее всего, имеет место с мьютексом. Как видно из сообщения, даже после встраивания вызова компилятор не устраняет эту проблему с сохранением/выпуском.
Поэтому, как было сказано, решение для лечения параметр mutex:
в гарантировано, что позволит компилятору устранить накладные расходы, как если мьютекс уже удерживается вызывающим абонентом, то нет никакой необходимости в дальнейшем сохраняется, чтобы гарантировать его существование в течение всего времени вызова sync
.
Способ сделать это, как говорится в сообщении, состоит в том, чтобы сделать sync
методом экземпляра PThreadMutex
.Это связано с тем, что в качестве Joe Groff says in this mailing list discussion, как и для Swift 2, методы экземпляра будут обрабатывать параметр self
как гарантированный.
Хороший ответ. (Здесь я думал, что это означает, что вы будете на 100% удовлетворены этим значением или можете вернуть свои деньги.;) – rickster