.. _synchronization_mechanism: 同步机制 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _synchronization_principle_introduction: 原理介绍 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ LXHPL提供以下几种同步机制: - Event的同步等待:调用lynSynchronizeEvent接口,阻塞当前线程执行,直至等待的Event被触发,该接口一般配合lynRecordEvent接口使用,调用顺序为: lynRecordEvent记录事件 → lynSynchronizeEvent同步等待该事件被触发 - Stream间的同步:Stream间的同步需要在源Stream中调用lynRecordEvent记录Event,并在目标Stream中调用lynStreamWaitEvent等待源Stream中的Event唤醒目标Stream,这样目标Stream中的后续异步任务才会继续下发。调用lynStreamWaitEvent不会阻塞当前线程执行,只是在目标Stream中插入一个待唤醒的Event。 - Stream内的同步:调用lynSynchronizeStream接口,阻塞当前线程执行,直到当前Stream中的所有任务都完成。 - Stream与Callback回调函数同步:在异步接口后调用lynStreamAddAsyncCallback添加异步回调函数,Stream中的异步指令执行完成后会自动执行自定义回调函数。 .. _event_synchronization_wait: Event同步等待 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。 .. code-block:: c //创建Event lynEvent_t event; lynCreateEvent(&event); //创建Stream lynStream_t stream; lynCreateStream(&stream); //在当前Stream中下发异步任务 //...... //stream末尾插入event lynRecordEvent(stream, event); //阻塞当前线程,等待event被唤醒,也就是stream执行完成 lynSynchronizeEvent(event); //销毁资源 lynDestroyEvent(event); lynDestroyStream(stream); .. _stream_synchronization: Stream间同步 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。 .. code-block:: c lynCreateContext(&context, 0); //创建解码器发送Stream、接收Stream以及图像预处理Stream lynCreateStream(&vdec_send_stream); lynCreateStream(&vdec_recv_stream); lynCreateStream(&ipe_stream); //创建Event lynCreateEvent(&vdec_event); //在发送Stream发送待解码包,在接收Stream中接收解码后的图像 lynVdecSendPacketAsync(vdec_send_stream, vdec, dmx_packet); lynVdecRecvFrameAsync(vdec_recv_stream, vdec, &vdec_frame); //在解码器接收Stream中插入Event lynRecordEvent(vdec_recv_stream, vdec_event); //在IPE Stream中等待该Event被唤醒,然后在IPE Stream中下发异步任务 //此处lynStreamWaitEvent并不阻塞当前线程执行 lynStreamWaitEvent(ipe_stream, vdec_event); lynIpeProcessAsync(ipe_stream, ipe_input, ipe_output, ipe_config); //同步等待,线程阻塞,直至所有Stream中的任务完成 lynSynchronizeStream(vdec_send_stream); lynSynchronizeStream(vdec_recv_stream); lynSynchronizeStream(ipe_stream); //销毁资源 lynDestroyEvent(vdec_event); lynDestroyStream(vdec_send_stream); lynDestroyStream(vdec_recv_stream); lynDestroyStream(ipe_stream); lynDestroyContext(context);