Однако я считаю, что код не полностью защищен от многопоточного доступа, поскольку он использует системный код низкого уровня.
/>Итак, кто-нибудь знает, как я могу гарантировать, что sysctl и gettimeofday являются потокобезопасными при их вызове? Или есть ли потокобезопасная альтернатива для получения того же результата?
Код: Выделить всё
func currentTime() -> TimeInterval {
var current = timeval()
let systemTimeError = gettimeofday(¤t, nil) != 0
assert(!systemTimeError, "system clock error: system time unavailable")
return Double(current.tv_sec) + Double(current.tv_usec) / 1_000_000
}
Код: Выделить всё
static func systemUptime() -> TimeInterval {
var mib = [CTL_KERN, KERN_BOOTTIME]
var size = MemoryLayout.stride
var bootTime = timeval()
let bootTimeError = sysctl(&mib, u_int(mib.count), &bootTime, &size, nil, 0) != 0
assert(!bootTimeError, "system clock error: kernel boot time unavailable")
let now = currentTime()
let uptime = Double(bootTime.tv_sec) + Double(bootTime.tv_usec) / 1_000_000
assert(now >= uptime, "inconsistent clock state: system time precedes boot time")
return now - uptime
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... e-in-swift