Проектирование класса потока - PullRequest
2 голосов
/ 19 января 2010

У меня есть вопрос дизайна. Лучше определить отдельные классы для отправки и получения. Или лучше определить один класс 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 ]

4 голосов
/ 19 января 2010

Я думаю, что лучше полностью отделить назначение или выполнение потока от фактической абстракции потока, которую вы будете использовать.

Сделайте ваш класс потока просто тонкой оболочкой, чтобы вы могли запускать, останавливать и присоединяться к потоку. Пусть он возьмет объект функтора (или указатель на функцию) в конструкторе для фактического выполнения.

Или, что еще лучше, используйте одну из множества доступных абстракций потоков, вместо того, чтобы писать свою собственную (boost :: thread для одной, но я держу пари, что любая используемая вами среда уже имеет класс потока).

3 голосов
/ 19 января 2010

Я разработал поток для связи через последовательный порт (в Python, а не в C ++, но это не имеет большого значения) следующим образом:

Существует один поток и две очереди - одна для отправленных и одна для полученных сообщений. Поток всегда прослушивает (асинхронно) как последовательный порт (для принятых данных), так и очередь отправки (для отправки данных, которые приложение просит отправить).

  1. Если данные поступили на последовательный порт, они помещаются в очередь приема для использования приложения
  2. Если приложение помещает данные в очередь отправки, поток отправляет их по последовательному порту

Этот дизайн имеет больше смысла для меня, потому что один ресурс (последовательный порт) удерживается одним потоком, а не разделяется двумя. Разбить его на несколько классов для меня звучит излишне, поскольку чтение / запись из очередей и чтение / запись из последовательного порта - тривиальная операция (естественно, последовательный порт заключен в удобный класс - кстати, я действительно рекомендую этот класс Рамона де Кляйна)

О, и это работает очень хорошо.

1 голос
/ 19 января 2010

Относительно очереди, которую нужно разделить. Оберните ее в отдельный класс и реализуйте там обработку мьютекса. Каждый класс потока содержит ссылку на оболочку очереди и вообще не нуждается в мьютексах.

0 голосов
/ 19 января 2010

2-й выбор явно плохой. Лучше иметь 2 разных класса, может быть, у вас может быть базовый класс, который имеет общую реализацию. Это только начальная оценка, пожалуйста, предоставьте больше информации о вашей проблеме, только тогда можно будет провести хороший анализ проблемы

...