使用用户输入在 C 中跨线程同步数据

Synchronizing data across threads in C with user input

我正在构建一个带有一些物理按钮的嵌入式东西。我有不同的线程来处理事物可能处于的不同模式,例如:

void *MakeToastThread() {
for(;;)
   if(CURRENT_MODE==MAKE_TOAST) makeSomeToast();
   else sleep(50ms);

void *MakeCoffeeThread() {
for(;;)
   if(CURRENT_MODE==MAKE_COFFEE) makeSomeCoffee();
   else sleep(50ms);

main ()
   // start threads
   // poll buttons
   // set CURRENT_MODE (global) using mutex_lock/mutex_unlock

这些线程中的每一个在它们处于活动状态时都会更新显示,我注意到竞争条件正在破坏显示。我的问题是 避免不同线程同时更新显示的最佳方法是什么? 或者更广泛地说,C 程序应该如何处理用户中断并在不同线程中同步数据?

一个建议是有一个单独的线程,它是 唯一的 负责 I/O 与用户的线程。

如果其他线程想要与用户交互,则让其他线程使用某种描述的线程间通信。

许多系统都使用这个概念,它大大简化了复杂性。

一个例子是线程 wanting I/O 和线程 doing I/O 之间的消息队列.

例如,它可以将输出请求消息发送到负责的线程,其中包含指定打印内容和位置的内容。然后它可以继续进行,因为知道输出会在某个时候完成。

或者它可以发送一个输入请求,详细说明提示和写入位置、最大输入大小、应放置输入的内存位置以及要调用的回调函数的地址,或要设置的标志,当操作结束时。复杂,但作为一个原子操作,这将使设施的用户更快乐。


另一种可能性是让用户 I/O 成为每个线程在需要访问时可以用互斥锁锁定的另一个资源。

具有互斥量的线程是唯一允许交互的线程,其他线程将被迫等待直到它再次可用。

但是, 解决方案可能会导致线程在本来可以执行实际工作时被阻塞。这对于输出可能无关紧要,因为它应该相对较快,但是 input 可能会成为一个问题,因为它依赖于用户实际输入的内容。