【问题标题】:Designing Thread Class设计线程类
【发布时间】:2010-01-19 18:44:51
【问题描述】:

我有一个设计问题。为发送和接收定义单独的类是否更好。或者,最好定义一个 Thread 类?我喜欢单个 Thread 类的想法,因为它更容易共享一个可以被互斥锁锁定的队列。

设计选项#1(独立):

mySendThread = new SendThread(); // Have thread properties and separate members

myRcvThread = new RcvThread(); // Have thread properties and separate members

设计选项#2(主):

主线程-

Execute() 
{
    if (threadType == RCV_THREAD)
    {
        globalVar = new MasterThread(serialPortHandle);
    }
    while (!Terminated)
    {
        if (threadType == RCV_THREAD)
        {
            if(globalVar) 
            {  
                // do work
            }
        }
        if (threadType == SND_THREAD)
        {
            tCountSnd = GetTickCount() / SND_THREAD_DELAY;
            if (tCountSnd != tCountSnd2) {
               tCountSnd2 = tCountSnd;
               if (globalVar) {
                   // do sending work
               }
            }
        }
     }
}

【问题讨论】:

  • 现有线程类(例如来自 Boost 的线程类)有什么问题?
  • 什么都没有。我不是在设计线程类。我是在设计实现

标签: c++ windows multithreading mutex c++builder


【解决方案1】:

我认为最好将线程的目的或执行与您将使用的实际线程抽象完全分离。

让您的线程类只是一个薄包装器,以允许您启动、停止和加入线程。让它在构造函数中使用一个仿函数对象(或函数指针)来实际执行。

或者更好的是,使用已经存在的许多可用线程抽象之一,而不是编写自己的(一个是 boost::thread,但我敢打赌,你使用的任何框架都已经有一个线程类)。

【讨论】:

    【解决方案2】:

    我设计了一个在串口上通信的线程(用 Python,不是 C++,但没关系)如下:

    有一个线程和两个队列——一个用于发送消息,一个用于接收消息。线程始终(异步)监听串行端口(接收数据)和发送队列(发送应用程序要求发送的内容)。

    1. 如果数据到达串行端口,则将其放入接收队列以供应用程序使用
    2. 如果应用程序将数据放入发送队列,线程将其发送到串口

    这种设计对我来说更有意义,因为单个资源(串行端口)由单个线程持有,而不是由两个线程共享。把它分成几个类对我来说听起来有点矫枉过正,因为从队列读/写和从串口读/写是一个微不足道的操作(当然,串口被包装在一个方便的类中——顺便说一句,我真的推荐@987654321 @拉蒙·德·克莱因)

    哦,效果很好。

    【讨论】:

    • 接收队列是应用程序和进程/发送线程之间共享的全局队列吗?
    • 它是一个同步队列对象——这真的取决于你在 C++ 中使用的线程/同步库
    • 如果接收正在处理消息或者这个队列被移交给工作线程,你如何防止接收被阻塞?
    • @Roboto,我不完全理解你的问题。假设 Queue 有一个非阻塞接口(即你可以问它是否有东西,它不会阻塞这个请求)。
    • 我的意思是串行端口...你收集消息然后必须对其进行处理。将其放入队列中很棒,但谁来处理消息 - 一个单独的线程?您不想停止阅读以处理我认为的消息
    【解决方案3】:

    关于要共享的队列.. 将其包装在一个单独的类中并在那里实现互斥体处理。每个线程类都持有对队列包装器的引用,根本不需要处理互斥锁。

    【讨论】:

      【解决方案4】:

      第二个选择显然是一个糟糕的选择。 最好有 2 个不同的类,也许你可以有一个具有共同实现的基类。这只是初步评估,请提供有关您的问题的更多信息,然后才能对问题进行良好的分析

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多