从Swift5.3版调用C函数:使用pthreads
EDIT3:从 RDerik 的代码中重新创建错误
我最初是从我从 RDerik 修改的代码开始的。现在,其他人可能会重新创建错误,我正在运行从这里克隆的 RDerik 中未经修改的代码。
当我运行 RDerik 的代码时,我收到以下错误(我在编辑中记录的相同错误:下面):
错误:可选类型“pthread_t?”的值 (又名“可选”)必须解包为“pthread_t”类型的值(又名“UInt”)
注意:
!如果可选值包含,则强制解包用于中止执行nil
错误:无法转换“(UnsafeMutableRawPointer) -> UnsafeMutableRawPointer?”类型的值 到预期的参数类型 '@convention(c) (UnsafeMutableRawPointer?) -> UnsafeMutableRawPointer?' let result = pthread_create(&myThread, nil, threadedFunction, pThreadParameter)
我通过将函数头更改threadedFunction()为:
func threadedFunction(pointer: UnsafeMutableRawPointer!) -> UnsafeMutableRawPointer?
原帖:
我知道之前已经回答过这个问题,但我一直无法找到与 Swift 5.3 兼容的修复程序。我需要调用的 C 函数具有以下签名:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
下面的第 5 行是我 Swift 尝试调用pthread_create(). 具体来说,我的问题是第一个参数:&myThread.
我的代码:(从这里修改)
var myThread: pthread_t! = nil
var threadParameter = _ThreadParameter(threadIdentifier: _ThreadIdentifier(id: ""), pxT: self)
var pThreadParameter = UnsafeMutablePointer<_ThreadParameter>.allocate(capacity:1)
pThreadParameter.pointee = threadParameter
let result = pthread_create(&myThread, nil, __threadedFunction, pThreadParameter)
错误:
调用 pthread_create 时,myThread 参数会引发以下错误:致命错误:在隐式解包可选值时意外发现 nil,第 5 行
编辑:
我尝试过的其他事情:
如果我像这样使用 a?而不是!pthread:
var myThread: pthread_t? = nil
我收到编译错误:
错误:可选类型“pthread_t?”的值 (又名“可选”)必须解包为“pthread_t”类型的值(又名“UInt”)
注意:使用 '!' 强制解包 如果可选值包含“nil”则中止执行
编辑2:
还试过:
let result = pthread_create(&myThread, 0, __threadedFunction, pThreadParameter)
错误:无法将“Int”类型的值转换为预期的参数类型“UnsafePointer<pthread_attr_t>?”