用ffi怎样提供线程安全的C函数指针
lua吧
全部回复
仅看楼主
level 1
金鱼师傅 楼主
正在给love2d提供一个openCL库:https://zhuanlan.zhihu.com/p/24853684
输入数据给openCL上下文很顺利,要实现读回的时候瞎了了。
我心中理想的接口是这样:
local result = {}
kernel:arg{inputv,result}
kernel:submit()
//wait for ready
use result
正常方法靠给事件设置回调函数:
cl_int clSetEventCallback( cl_event event,
cl_int command_exec_callback_type ,
void (CL_CALLBACK *pfn_event_notify) (cl_event event, cl_int event_command_exec_status, void*user_data),
void *user_data)
在pfn_event_notify里把数据写回table
ffi.cast非常强大,可以把一个lua函数包装成一个C函数指针
然而openCL文档说了pfn_event_notify要自己保证线程安全。哪怕我能给upvalue上锁,我还能给lua的VM上锁么,是不是光靠lua和ffi就没招了?
2017年01月16日 07点01分 1
level 11
lua,,,恩,,,不支持线程[滑稽]貌似你这边上锁了 lua里解不开,所以你必须用user_data 且封装一个锁检测函数给lua,代码里出现线程争议 ,你就上那个函数 lua按道理应该会被卡住[滑稽]再不行,,你就把lua里的代码改成协程,外部利用lua协程api卡lua[滑稽]这样就避开需要给vm加锁的问题了
2017年01月16日 16点01分 2
协程什么都不可靠,cl线程一进函数,我的代码屁都来不及放,就因为多线程操作lua_State挂了。我痛苦了一天算是想通了,把异步的enqueue/read/write都干掉,全用阻塞的map/unmap代替,这样至少我还能靠AMD扩展省点内存拷贝开销。
2017年01月17日 08点01分
@金鱼师傅 [滑稽]对的,如果要多线程 那就必须堵塞 因为lua原生不支持,嘿嘿嘿,你可以自己加哦(原理照样堵塞)
2017年01月18日 15点01分
@金鱼师傅 用携程也是为了卡(堵塞) 携程自带堵塞功能嘿嘿嘿(不过貌似还是会崩溃)
2017年01月18日 16点01分
@协调意志_Tox 我的意思就是加不了,除非你可以写不操作lua_State的lua函数。解决这办法最直接是加个C编译器,编译C函数,而不是靠ffi.cast把lua函数封装出C接口
2017年01月19日 05点01分
1