Как перейти с OSSpinLock на os_unfair_lock()?

Начиная с MacOS 10.12, OSSpinLock был объявлен устаревшим Сообщения об ошибках XCode побуждают меня использовать os_unfair_lock_unlock() вместо.

В качестве наследства некоторых вещей с открытым исходным кодом, на которые я полагаюсь, я использую RegexKitLite с 2010 года.

Как я могу преобразовать тип блокировки вращения? Я могу управлять простой разблокировкой и блокировкой, но эти сравнения вызывают у меня головную боль:

if(rkl_cacheSpinLock != (OSSpinLock)0) { ... }

rkl_cacheSpinLock имеет тип os_unfair_lock и был инициализирован. OSSpinLock, кажется, имеет тип intтак что это if-утверждение, очевидно, не будет работать.

Может ли кто-нибудь указать мне правильный путь к этому? Я не слишком знаком с C и не очень понимаю арифметику указателей.

РЕДАКТИРОВАТЬ

После того, как я немного узнал о Си, я понял, что такое типизация Я пришел к решению, которое, кажется, работает. Мое понимание функциональности ОС на этом уровне отсутствует. Os_unfair_lock не слишком хорошо документирован для чайников, но похоже, что я ничего не сломал.

if (rkl_cacheSpinLock._os_unfair_lock_opaque != 0) { ... }

0 ответов

Похоже, никто никогда не удосужился ответить на ваш вопрос, так что вот оно:

#include <os/lock.h>

void foo() 
{
    os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
    os_unfair_lock_lock(&lock);

    /* Your critical section here */

    os_unfair_lock_unlock(&lock);
}

Пожалуйста, обратитесь к документации для получения более подробной информации об ограничениях относительно того, где вы должны блокировать и разблокировать (tldr: это должен быть тот же поток, который блокирует и разблокирует).

Другие вопросы по тегам