0

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

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

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

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

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

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

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

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

如果有人可以帮助我,我将不胜感激!!

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

谢谢

4

1 回答 1

0

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

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

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

2) 创建一个由临界区保护的先进先出队列。

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

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

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

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

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

于 2012-05-25T12:48:26.560 回答