从Swift 5.3版调用C函数:使用pthreads

从Swift 5.3版调用C函数:使用pthreads,swift,Swift,EDIT3:重新创建RDerik代码中的错误 我最初是从RDerik修改的代码开始的。现在,其他人可能会重新创建错误,我正在运行从克隆的RDerik中未修改的代码 当我运行RDerik的代码时,会出现以下错误(与我在编辑中指出的错误相同:如下所示): 错误:可选类型“pthread\u t”(又名“optional”)的值必须解压缩为类型“pthread\u t”(又名“UInt”)的值 注意:使用强制展开如果可选值包含nil 错误:无法将类型为“(UnsafemtableRawPointer)

EDIT3:重新创建RDerik代码中的错误

我最初是从RDerik修改的代码开始的。现在,其他人可能会重新创建错误,我正在运行从克隆的RDerik中未修改的代码

当我运行RDerik的代码时,会出现以下错误(与我在编辑中指出的错误相同:如下所示):

错误:可选类型“pthread\u t”(又名“optional”)的值必须解压缩为类型“pthread\u t”(又名“UInt”)的值

注意:使用
强制展开
如果可选值包含
nil

错误:无法将类型为“(UnsafemtableRawPointer)->UnsafemtableRawPointer?”的值转换为预期的参数类型“@convention(c)(UnsafemtableRawPointer?->UnsafemtableRawPointer?” 让result=pthread_创建(&myThread,nil,threadedFunction,pthread参数)

我通过将
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行是我快速调用
pthread\u create()
的尝试。具体来说,我的问题在于第一个参数:
&myThread

我的代码:(修改自)

我发现编译错误:

错误:可选类型“pthread\u t”(又名“optional”)的值必须解压缩为类型“pthread\u t”(又名“UInt”)的值

注意:使用“!”强制展开如果可选值包含“nil”,则中止执行

EDIT2:

还尝试:

    let result = pthread_create(&myThread, 0, __threadedFunction, pThreadParameter)
错误:无法将“Int”类型的值转换为预期的参数类型“UnsafePointer”


我不知道斯威夫特。但是,在c中,与
NIL
对应的是
NULL
NULL
同样是一个宏,具体取决于编译器。因此,它可以定义为
#define NULL((char*)0)
,也可以简单地定义为
#define NULL 0
。那么,如果您通过
pthread\u create(&myThread,0,
而不是nil?

好线程,并提供有用的链接,会发生什么情况呢?出于好奇,为什么您需要特别调用
pthread\u create
,而不是使用Swift可用的其他并发范例之一(例如Dispatch)?其他建议:在这种情况下,我经常发现创建一个小的“测试用例”非常有用。预先做一些额外的工作…但可以节省大量时间来获得所需的解决方案。请尝试以下操作:1)下载此项目:2)完成相应的教程:。3) 一旦测试用例开始工作,就将解决方案应用到实际项目中。4) 如果您在环境中遇到RDerick的代码问题,请发布新的SO问题。另外:您是否尝试了wired的:
let result=pthread\u create(&myThread,0,u threadedFunction,pthread parameter)
?发生了什么事?鉴于您发布的代码,我无法重现这一点,但我不得不对您的代码与链接到的代码之间的差异进行大量猜测(例如,您在不同的位置添加了下划线,这些下划线不在原始代码中,并且您的ThreadParameter也不同)。你能发布一个复制它的完整例子吗?谢谢@wired。我尝试了你的建议,并在我的原始帖子的EDIT2下发布了结果。如前所述,我不知道swift,但这个链接可能会有所帮助,因为它处理a)swift和pthreads b)不安全指针swift的nil与C的NULL不是一回事。在ObjC中,这基本上是正确的,但在Swift中则不然<代码>无与
可选相同。无
。当桥接到C(通过ObjC)时,可以将其转换为0,但不能在Swift中以这种方式替换它。
    var myThread: pthread_t? = nil
    let result = pthread_create(&myThread, 0, __threadedFunction, pThreadParameter)