【问题标题】:using multithread program to receive and organize a serial message (in C++)使用多线程程序接收和组织串行消息(在 C++ 中)
【发布时间】:2012-05-25 12:14:51
【问题描述】:

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

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

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

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

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

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

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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,但我还有一些问题……我不知道如何创建一个由临界区保护的 FIFO 队列。你能告诉我一些示例代码,以帮助我了解这个想法吗?谢谢
    • @NatCruella 这只是一个列表。任何保持秩序的清单都可以。先进先出意味着您将新项目放在最后,然后从头开始(或相反,这取决于您的选择)。
    • "Guarded by critical section" 这也只是程序员的使用方法。它只是意味着线程必须在访问队列之前获取临界区(或互斥体、信号量或任何您喜欢的线程同步)。您可以简单地确保在访问队列的每一段代码中,关键部分是在之前获取的,然后是之后释放的。或者创建一个对象,将队列和 critsection 封装为私有成员。唯一公开的公共方法是 Add() 和 Remove(),在这些方法中获取 critction、访问列表和释放 critsection。
    • 哦,我明白了!非常感谢!!
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多