多线程c程序设计帮助

6 c multithreading

我没有多线程的经验,我正在编写一个我认为适合在两个线程中运行的交流程序.程序将在串行端口上侦听数据,在可用时读取和处理新数据,并在请求时通过第三方IPC api(它令人困惑地命名为IPC)将最新处理的数据发布到其他(不相关的)模块.

为了通过IPC接收发布数据的请求,程序必须调用IPC_listenwait(wait_time);. 然后,如果在"listenwaiting"时收到发布请求,则调用处理程序以发布最新数据.

一种选择是在一个线程中执行此操作,如:

for(;;) {
  read_serial(inputBuffer);
  process_data(inputBuffer, processedData); //Process and store
  IPC_listenwait(wait_time); //If a request to publish is received during this, 
}                            //then a handler will be invoked and the newest piece of        
                             //processedData will be published to other modules

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
  IPC_publish(newest(processedData));
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但对于应用程序来说,重要的是程序对发布新数据的请求非常敏感,并且发布的数据是最新的.这些目标不满足于上述目标,因为数据可能在过程开始监听等待之后并且在接收到发布消息请求之前到达.或者,当发布消息请求进入时,进程可能正在读取/处理,但在下一次IPC_listenwait调用之前无法对其进行服务.

我能想到的唯一设计就是有一个线程可以读取,它只会做类似的事情:

readThread() {
    for(;;) { //pseudocode
      select();
      read(inputBuffer);
      process(inputBuffer, processedData);
    }
}
Run Code Online (Sandbox Code Playgroud)

让主线程只是监听传入的消息:

mainThread() {
  IPC_listenwait(forever);
}

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
  IPC_publish(newest(processedData));
}
Run Code Online (Sandbox Code Playgroud)

这是你要使用的设计吗?如果是这样,我在访问或编写processedData时是否需要使用信号量?

这会给我很好的回应吗?

谢谢

Blr*_*rfl 4

你基本上走在正确的轨道上。

您必须注意的一件事是对可发布数据的并发访问,因为您不希望一个线程在另一个线程尝试读取它时破坏它。为了防止这种情况,请使用一对缓冲区和一个受互斥锁保护的指针,指向被认为是当前的缓冲区。当process_data()有东西准备好时,它应该将其结果转储到非当前缓冲区中,锁定指针互斥锁,将指针重新指向包含新数据的缓冲区,然后释放互斥锁。类似地,发布者应该在读取当前数据时锁定指针互斥锁,这将迫使任何可能想要破坏它的东西等待。这比使用单个受互斥锁保护的缓冲区要复杂一些,但可以确保在准备新数据时始终有最新的内容可以发布。

如果您的处理步骤花费的时间足够长,以至于您可以读取多组数据,那么您可以将读取/处理线程分成两个,并让读者确保处理器只获取最新和最好的数据,这样您就不会结束处理你永远不会发布的东西。

顺便说一句,第一个问题非常好。投个赞成票吧