FlexibleButton icon indicating copy to clipboard operation
FlexibleButton copied to clipboard

有考虑过 flex_button_register 和 button_scan 线程安全

Open MRkuan opened this issue 5 years ago • 3 comments

按照DEMO的时序是 在 init初始化 flex_button_register 注册好按键,然后开启线程button_scan 进行扫描,这个肯定没问题


如果在其它应用调用 flex_button_register , 会和 button_scan 有线程安全问题?,导致加入按键链表有的 按键 结构体数据可能不完整,被button_scan 打断,导致有问题

加下这两个函数互斥应该完美点。。。

MRkuan avatar Nov 04 '20 10:11 MRkuan

还有 flex_button_event_read 读出事件结果,没有读写锁,也没有线程安全

以上是本人的拙见。。。。

MRkuan avatar Nov 04 '20 10:11 MRkuan

感谢您的反馈 😃

确实会存在多线程安全的问题,后续我考虑下如何简单实现数据互斥,您有好的想法和代码实现也可以直接 PR 提上来 。

murphyzhao avatar Nov 07 '20 12:11 murphyzhao

像例程中单独创建一个按键任务,即使在任意时刻打断,恢复上下文将继续操作。 操作flex_button全局,只在当前按键任务进行操作,是线程安全的; 只要不在别的任务进行flex_button库的数据操作或其他操作即可; 可以在按键回调任务发送事件,信号量或队列进行数据传递;

如果非要在其他任务操作 flex_button_register: 我推荐的做法是
void other_task() { flex_button_register(); semp_give(); // 注册完成 发送信号量解除按键任务阻塞 for(;;){ //.......... } } void key_task() { semp_take(max_delay); // 等待创建完成进行 扫描工作 for(;;){ flex_key_scan(); os_delay(20); } }

FangXS-github avatar Jan 17 '24 10:01 FangXS-github