我正在玩pthreads和服务质量。当然,我认为最好的方法是在Xcode Playground中。
下面的代码运行正常。
var user_interactive_thread: pthread_t = nil
pthread_create(&user_interactive_thread, nil, { (x:UnsafeMutablePointer<Void>) in
print("pthread ran")
return nil
}, nil)
但随后我尝试添加QoS属性:
var user_interactive_thread: pthread_t = nil
var user_interactive_qos_attr: pthread_attr_t
pthread_attr_init(&user_interactive_qos_attr)
pthread_attr_set_qos_class_np(&user_interactive_qos_attr, QOS_CLASS_USER_INTERACTIVE, 0)
pthread_create(&user_interactive_thread, &user_interactive_qos_attr, { (x:UnsafeMutablePointer<Void>) in
print("User interactive pthread")
return nil
}, nil)
但是我得到了以下编译错误:
Playground execution failed: /var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:16:42: error: address of variable 'user_interactive_qos_attr' taken before it is initialized
pthread_create(&user_interactive_thread, &user_interactive_qos_attr, { (x:UnsafeMutablePointer<Void>) in
^
/var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:11:5: note: variable defined here
var user_interactive_qos_attr: pthread_attr_t
^
/var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:14:31: error: address of variable 'user_interactive_qos_attr' taken before it is initialized
pthread_attr_set_qos_class_np(&user_interactive_qos_attr, QOS_CLASS_USER_INTERACTIVE, 0)
^
/var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:11:5: note: variable defined here
var user_interactive_qos_attr: pthread_attr_t
^
/var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:13:19: error: address of variable 'user_interactive_qos_attr' taken before it is initialized
pthread_attr_init(&user_interactive_qos_attr)
^
/var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground7.swift:11:5: note: variable defined here
var user_interactive_qos_attr: pthread_attr_t
^
这很有帮助,你可以很明显地看到我哪里出错了。但是当我尝试将user_interactive_qos_attr
初始设置为nil时,我得到以下错误:
Playground execution failed: /var/folders/fv/m8h6cz5n7xx7bwb7qxppx2qc0000gn/T/./lldb/29864/playground8.swift:11:49: error: nil cannot initialize specified type 'pthread_attr_t' (aka '_opaque_pthread_attr_t')
var user_interactive_qos_attr: pthread_attr_t = nil
^
然后我转向可选选项。这消除了所有编译器错误,但当试图打开可选的nil时发生了运行时错误。
我做错了什么吗?或者Swift 2中不完全支持pthreads ?
如果有更熟悉pthreads/Swift的人可以仔细检查:
这似乎工作完美:
var return_value: Int32 = 0
var user_interactive_thread = pthread_t()
var user_interactive_qos_attr = pthread_attr_t()
return_value = pthread_attr_init(&user_interactive_qos_attr)
return_value = pthread_attr_set_qos_class_np(&user_interactive_qos_attr, QOS_CLASS_USER_INTERACTIVE, 0)
return_value = pthread_create(&user_interactive_thread, &user_interactive_qos_attr, { (x:UnsafeMutablePointer<Void>) in
print("User interactive pthread")
return nil
}, nil)
有或没有return_value
明显
它似乎不应该工作。我好像欺骗了初始化器