设计线程类

时间:2010-01-19 18:44:51

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

我有一个设计问题。为SENDING和RECEIVING定义单独的类是否更好。或者,定义一个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
               }
            }
        }
     }
}

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

我设计了一个用于在串口上进行通信的线程(在Python中,而不是C ++,但并不重要),如下所示:

有一个线程和两个队列 - 一个用于发送,一个用于接收消息。线程总是在串行端口(用于接收数据)和发送队列(用于发送应用程序请求发送的内容)上(异步)侦听。

  1. 如果数据到达串口,则将其放在接收队列中以供应用程序使用
  2. 如果应用程序将数据放入发送队列,则线程将其发送到串行端口
  3. 这种设计对我来说更有意义,因为单个资源(串行端口)由单个线程保存,而不是由两个共享。将它分解为几个类听起来对我来说太过分了,因为从队列中读取/写入以及从串行端口读取/写入是一项微不足道的操作(自然地,串行端口被包装在一个方便的类中 - 按照我真正推荐的方式{{拉蒙德克莱因3}}

    哦,而且效果很好。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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