Safe 1.2.0

Safe 1.2.0

测试已测试
Lang语言 SwiftSwift
许可证 自定义
发布最后发布2016年1月
SPM支持 SPM

Josh Baker维护。



Safe 1.2.0


特性

  • 简单的 Atomic<T> 类,适用于数字和字符串。
  • 用于触发后台进程的无复杂性 dispatch 关键字。
  • 优秀的 Chan<T>,用于并发通信。
  • 有用的同步 API。 MutexCondOnceWaitGroup

原子操作

类型

IntInt8Int16Int32Int64UIntUInt8UInt16UInt32UInt64FloatDoubleBoolString

运算符

==, !=, &&, ||, <=, >=, >, <, !
+, -, *, /, %, <<, >>, ^, &, &+, &-, &*, ++, --, +=, -=, *=, /=, %=, +=, <<=, >>=, ^=, &=

var anum = IntA(100)      // IntA is an alias for Atomic<Int>.
anum += 15                // Adds a value atomically.
let res = anum % 4        // Modulo operation atomically.
print("\(anum) \(res)")   // prints '115 3'.

分发

Safe 添加了一种简单的方法来分发进程。

dispatch {
    print("Background")
}
print("Foreground")

通道

一个新的 Chan<T> 类提供了一种简洁、简单的模型,用于并发共享对象。Chan<T> 的模式是基于 Go 通道

通过通信共享内存

示例

let jobs = Chan<Int>(5)  // buffered channel
let done = Chan<Bool>()  // unbuffered channel

dispatch {
    for ;; {
        if let j = <-jobs {
            print("received job \(j)")
        } else {
            print("received all jobs")
            done <- true
            return
        }
    }
}

for var j = 1; j <= 3; j++ {
    jobs <- j
    print("sent job \(j)")
}
jobs.close()
print("sent all jobs")

<-done

迭代

通道也可以迭代。

while let j = <-jobs {
    print("received job \(j)")
}
print("received all jobs")

选择

_select 关键字是一个多通道通信多路复用器,它作用于多个通道。_select_case_default 以下划线开头,以便它们不会与selectcasedefault系统调用和关键字冲突。当_select 遇到具有数据的多个通道时,随机选择_case

let jobs1 = Chan<Int>()
let jobs2 = Chan<Int>()

dispatch {
    for ;; {
        _select {
            _case(jobs1){ j in
                print("received 1: \(j)")
            }
            _case(jobs2){ j in
                print("received 2: \(j)")
            }
        }
    }
}

for var j = 1; ; j++ {
    jobs1 <- (j * 1000)
    jobs2 <- (j * 2000)
    NSThread.sleepForTimeInterval(1)
}

带默认值的选择

_select 可以包含一个单_default,用于非阻塞操作。

_select {
    _case(jobs1){ j in
        print("received 1: \(j)")
    }
    _case(jobs2){ j in
        print("received 2: \(j)")
    }
    _default {
        print("channels not ready")
    }
}

互斥锁、条件变量、单次一次性、等待组

非常有用的同步 API。

互斥锁

let m = Mutex()
m.lock()           
m.unlock()         
m.lock {
    // this block is locked
}

条件变量

let c = Cond(Mutex())
c.wait()                // wait for signal.
c.wait(0.25)            // wait for signal or 250ms to pass.
c.signal()              // signal to one wait.
c.broadcast()           // signal to all waits.

单次一次性

func f(){
    print("hey there")
}

let o = Once()
o.doit(f)               // runs once
o.doit(f)               // noop: cannot run twice

等待组

let dosomething : (NSTimeInterval, WaitGroup)->() = { (delay, wg) in
    NSThread.sleepForTimeInterval(delay)
    print("Function in background, duration: \(delay)")
    wg.done()
}
let wg = WaitGroup()
wg.add(1)
dispatch { dosomething(0.40, wg) }
wg.add(1)
dispatch { dosomething(0.30, wg) }
wg.add(1)
dispatch { dosomething(0.15, wg) }
wg.add(1)
dispatch { dosomething(0.60, wg) }
wg.wait()
print("done")

安装(iOS 和 OS X)

手动安装

Source/*.swift 文件复制到您的项目中。

手动安装时无需导入 import Safe

联系信息

Josh Baker @tidwall

许可证

Safe 源代码在 MIT 许可证下可用。