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

时间:2015-04-01 05:20:20

标签: 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);

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

一个例子是线程想要 I / O和线程 I / O之间的消息队列。

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

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


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

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

然而,解决方案可能最终导致线程被阻止,否则它们可以正常工作。这可能对输出无关紧要,因为它应该相对较快,但输入可能会成为一个问题,因为它依赖于用户实际输入的东西。