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

使用用户输入在C中跨线程同步数据,c,multithreading,user-controls,mutex,race-condition,C,Multithreading,User Controls,Mutex,Race Condition,我正在用一些物理按钮构建一个嵌入式的东西。我有不同的线程处理不同的模式,例如: void *MakeToastThread() { for(;;) if(CURRENT_MODE==MAKE_TOAST) makeSomeToast(); else sleep(50ms); void *MakeCoffeeThread() { for(;;) if(CURRENT_MODE==MAKE_COFFEE) makeSomeCoffee(); else sleep(50ms)

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

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的线程

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

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

例如,需要I/O的线程和执行I/O的线程之间的消息队列

例如,它可以向负责的线程发送一条输出请求消息,其中包含指定打印内容和位置的内容。然后它就可以继续,安全地知道输出会在某个时候完成

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


另一种可能是使用户I/O成为另一种资源,当每个线程想要访问它时,可以使用互斥锁将其锁定

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


然而,这个解决方案可能会导致线程在执行实际工作时被阻塞。这对于输出来说可能并不重要,因为输出速度应该相对较快,但输入可能会成为一个问题,因为它依赖于用户实际输入的内容。

一个建议是使用一个单独的线程,该线程是唯一负责与用户进行I/O的线程

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

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

例如,需要I/O的线程和执行I/O的线程之间的消息队列

例如,它可以向负责的线程发送一条输出请求消息,其中包含指定打印内容和位置的内容。然后它就可以继续,安全地知道输出会在某个时候完成

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


另一种可能是使用户I/O成为另一种资源,当每个线程想要访问它时,可以使用互斥锁将其锁定

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


然而,这个解决方案可能会导致线程在执行实际工作时被阻塞。这对于输出来说可能并不重要,因为输出速度应该相对较快,但输入可能会成为一个问题,因为它依赖于用户实际输入的内容。

一个建议是使用一个单独的线程,该线程是唯一负责与用户进行I/O的线程

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

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

例如,需要I/O的线程和执行I/O的线程之间的消息队列

例如,它可以向负责的线程发送一条输出请求消息,其中包含指定打印内容和位置的内容。然后它就可以继续,安全地知道输出会在某个时候完成

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


另一种可能是使用户I/O成为另一种资源,当每个线程想要访问它时,可以使用互斥锁将其锁定

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


然而,这个解决方案可能会导致线程在执行实际工作时被阻塞。这对于输出来说可能并不重要,因为输出速度应该相对较快,但输入可能会成为一个问题,因为它依赖于用户实际输入的内容。

一个建议是使用一个单独的线程,该线程是唯一负责与用户进行I/O的线程

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

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

例如,需要I/O的线程和执行I/O的线程之间的消息队列

例如,它可以向负责的线程发送一条输出请求消息,其中包含指定打印内容和位置的内容。然后它就可以继续,安全地知道输出会在某个时候完成

或者,它可以发送一个输入请求,详细说明提示和写入位置、最大输入大小以及