使用多线程程序接收和组织串行消息(用C ++语言)

时间:2012-05-25 12:14:51

标签: multithreading multidimensional-array serial-port mutex critical-section

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

我必须创建一个接收串行(和连续)异步消息的程序,然后读取它并组织此消息。

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

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

所以,我在这个程序中遇到了一些问题:

  • 首先,当我停止写入以开始读取部分时,我丢失了一些串行消息。这就是我尝试使用互斥锁或关键部分的原因。但它不起作用,我不知道为什么。

  • 第二个问题是,第二个矩阵(Msg [] [])在某些行的中间有奇怪的'0'序列,我怀疑这个'0'出现在这个帖子中开始读取RxTh矩阵的新行。它有意义吗?

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

如果有人可以帮助我,我会非常感激!!

如果您需要更多信息或一部分代码,请问我!

由于

1 个答案:

答案 0 :(得分:0)

你真正想要的是缓冲区队列。您的矩阵只是复制了这个,但是令人困惑,并且没有携带元数据(有关数据的数据)。

1)定义一个包含缓冲区的类或结构+关于此缓冲区中的内容的一些信息(比如已向其写入了多少数据)。像:

class Buff
{
    char contents[1024]; //(this represents your row)
    int numWritten;
    ...
}

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

现在,Thread1创建new缓冲区,填充它并获取关键部分,将缓冲区推送到队列末尾,并释放临界区。

Thread2获取关键部分,从队列中取出第一个缓冲区,释放关键部分。 完成处理缓冲区后,删除它。

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

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

如果为每个缓冲区分别使用互斥锁,则可以轻松锁定一个缓冲区。但是在没有一个线程正在发送而一个正在接收的情况下没有必要。