2017-01-04 2 views
0

Мне нужна некоторая синхронизация между несколькими процессами, что-то вроде семафоров POSIX или общей последовательной диспетчерской очереди. Есть ли что-то подобное для быстрого в OS X.Синхронизация процессов swift по OSX

+0

'sem_open()' и друзья, кажется, доступны в Swift, вы пытались его использовать? –

+0

Я пропустил их, я просто просматривал документы. Можете ли вы отправить ответ, и я приму его? – Jelly

ответ

1

Именованные семафоры доступны в Swift:

import Darwin 

var sema = sem_open("/mysema", O_CREAT, 0o666, 0) 
guard sema != SEM_FAILED else { 
    perror("sem_open") 
    exit(EXIT_FAILURE) 
} 

defer { sem_close(sema) } 

print("Waiting for semaphore") 
sem_wait(sema) 
print("Got semaphore") 
0

Как указал Мартин Р, это работает между потоками, а не процессами.

Да, конечно, вы should read о Центральном диспетчерском пункте (GCD). Или here.

Хорошее видео для него here на WWDC.

Вот пример о семафоров, взятых из here:

private func semaphoreExample2() { 
    let semaphore = dispatch_semaphore_create(0) 
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(queue) { 
     NSLog("Running async task...") 
     sleep(3) 
     NSLog("Async task completed") 
     dispatch_semaphore_signal(semaphore) 
    } 
    NSLog("Waiting async task...") 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    NSLog("Continue!") 
} 

Или еще один в Swift 3 из here:

// creating the semaphore with a resource count of 1 
let semaphore  = DispatchSemaphore(value: 1) 
let watchdogTime = DispatchTime.now() + DispatchTimeInterval.seconds(1) 
... 

// synchronize access to a shared resource using the semaphore 
if case .TimedOut = semaphore.wait(timeout: watchdogTime) { 
    print("OMG! Someone was bogarting that semaphore!") 
} 
// begin access shared resource… 
... 

// end access to resource 
semaphore.signal() 
+0

Может ли семафор GCD делиться между различными * процессами *? –

+0

Пропущен раздел «между процессами» :-( –

Смежные вопросы