Multithreading 使用多线程程序接收和组织串行消息(在C+;+;)

Multithreading 使用多线程程序接收和组织串行消息(在C+;+;),multithreading,multidimensional-array,serial-port,mutex,critical-section,Multithreading,Multidimensional Array,Serial Port,Mutex,Critical Section,我是编程多线程的新手,所以我想知道是否有人能帮我 我必须制作一个接收串行(连续)异步消息的程序,然后读取并组织该消息 我尝试使用多线程策略:第一个线程负责接收串行信息并将其写入矩阵(RxTh[col][row]),一次一行。 然后,调用第二个线程,读取RxTh矩阵的每一行并搜索特定字符(表示“开始行”消息)。该线程还必须将接收到的消息放入另一个矩阵(Msg[col2][row2]),将新矩阵中不同行中的每一行Msg分开 在未来,我将不得不处理这些重新排列的行,并搜索具体的信息,但我现在不考虑这一

我是编程多线程的新手,所以我想知道是否有人能帮我

我必须制作一个接收串行(连续)异步消息的程序,然后读取并组织该消息

我尝试使用多线程策略:第一个线程负责接收串行信息并将其写入矩阵(RxTh[col][row]),一次一行。 然后,调用第二个线程,读取RxTh矩阵的每一行并搜索特定字符(表示“开始行”消息)。该线程还必须将接收到的消息放入另一个矩阵(Msg[col2][row2]),将新矩阵中不同行中的每一行Msg分开

在未来,我将不得不处理这些重新排列的行,并搜索具体的信息,但我现在不考虑这一部分

所以,我对这个程序有一些问题:

  • 首先,当我停止写作开始阅读部分时,我丢失了一些串行消息。这就是为什么我尝试使用互斥,或者临界区。但它不起作用,我也不知道为什么

  • 第二个问题是第二个矩阵(MSG[]]在某些行的中间有奇怪的‘0’序列,我怀疑这个‘0’出现,而这个线程开始读取RXTH矩阵的新行。这有什么意义吗

  • 当我使用互斥时,一次只能锁定一行吗

如果有人能帮助我,我将非常感激

若你们需要更多的信息或一段代码,只要问我


谢谢

您真正想要的是一个缓冲队列。您的矩阵只是在复制它,但很混乱,并且不携带元数据(关于数据的数据)

1) 定义一个类或结构,该类或结构包含一个缓冲区+有关该缓冲区中内容的一些信息(例如有多少数据已写入该缓冲区)。比如:

2) 创建一个由关键部分保护的FIFO队列

现在,Thread1创建
new
缓冲区,填充它并获取临界区,将缓冲区推到队列的末尾,然后释放临界区

Thread2获取临界段,从队列中取出第一个缓冲区,释放临界段。 处理完缓冲区后,删除它

您将需要一些额外的同步,因此如果没有更多的完整缓冲区要处理,thread2可以等待。另外,如果填充的缓冲区数量太多,thread1应该暂停,以便给thread2更多的时间

如果您觉得创建和删除缓冲区可能不是最优的,那么请创建一些缓冲区管理器。它将保存预定义数量的缓冲区(列数)。Thread1将从该池中获取缓冲区,而不是
new
,thread2将它们返回到池中,而不是
delete


如果为每个缓冲区创建单独的互斥体,则可以轻松地一次锁定一个缓冲区。但是在只有一个线程在发送,一个线程在接收的情况下,这是不必要的。

谢谢你的回答,但我还有一些问题。。。我不知道如何创建由关键部分保护的FIFO队列。你能给我看一些示例代码,帮助我理解这个想法吗?Thanks@NatCruella这只是一张单子。任何保持秩序的清单都可以。先进先出意味着你把新的项目放在最后,然后从一开始就把它们取下来(或者说,这是你的选择)。“由关键部分保护”这也是程序员使用它的方法。它只是意味着线程必须在访问队列之前获取关键部分(或互斥、信号量或任何您喜欢的线程同步)。您可以简单地确保在访问队列的每一段代码中,关键部分都是在之前获取的,之后释放的。或者创建一个对象,将队列和critsection封装为私有成员。唯一公开的公共方法是Add()和Remove(),在这些方法中,critection被获取,list被访问,critesection被发布。哦,我明白了!非常感谢!!
class Buff
{
    char contents[1024]; //(this represents your row)
    int numWritten;
    ...
}