栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C回调和非Go线程

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C回调和非Go线程

我假设您的意思是使用gcc编译的C代码?

IIRC,使用6g + cgo和朋友无法完成或无法轻松完成。Go使用不同的调用约定(以及分段堆栈等)。

但是,您 可以 为[685] c(甚至[685]
a)编写C代码,并使用package·function()轻松调用go(甚至可以调用IIRC方法)。有关示例,请参见软件包的来源

runtime

更新:

更新后再回到这个问题,并再考虑一下。使用6c或cgo无法以标准方式完成此操作。特别是因为线程不是由go运行时启动的,所以当前的实现会失败。调度程序突然将一个它不知道的线程置于其控制之下。另外,该线程将缺少go运行时用于管理堆栈的其他线程局部变量和其他一些东西。另外,如果go函数返回一个(或多个)值,那么C代码将无法在当前支持的平台上访问它,因为go返回了堆栈中的值(不过您可以使用汇编程序来访问它们)。考虑到这些事情,我相信您仍然可以使用渠道进行此操作。这将需要您的C代码与go运行时的内部工作过于亲密,但对于给定的实现它会起作用。虽然使用通道可能不是您要寻找的解决方案,但它可能比回调更适合Go的概念。如果您的C代码至少重新实现了发送方法,通道实现(该代码是为6c编写的,因此很可能必须针对gcc进行修改,并且它调用go运行时,我们已经确定无法通过非执行线程完成该运行时),您应该能够锁定通道并向其推送值。go调度程序可以继续管理自己的线程,但是现在它可以从C中启动的其他线程接收数据。

诚然,这是黑客。我的距离还不够近,但是可能还需要一些其他技巧才能使其正常工作(我相信渠道本身会维护正在等待它们的goroutine的列表[EDIT:/confirm/ied:

runtime·ready(gp);
],因此您需要您的Go代码中的某些内容会唤醒接收通道或保证Go代码不会在您已推入值之前在该通道上接收)。不过,我看不出任何原因,这
不能 工作,而有一些产生以6克代码运行在C不能创建一个线程明确的原因。

我的原始答案仍然成立: 除非在语言或运行时中添加任何内容,否则尚无法 按照您希望的方式进行(我很乐意在此证明是错误的)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633142.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号