2015-09-03 3 views
0

В следующем примере (не весь код включен только необходимые части):Использование же подталкивание: переменная нить для создания нескольких потоков

class A 
{ 
public: 
void FlushToDisk(char* pData, unsigned int uiSize) 
{ 
    char* pTmp = new char[uiSize]; 
    memcpy(pTmp, pData, uiSize); 
    m_Thread = boost::thread(&CSimSwcFastsimExporter::WriteToDisk, this, pTmp, uiSize); 

} 
void WriteToDisk(char* pData, unsigned int uiSize) 
{ 
    m_Mtx.lock(); 
    m_ExportFile.write(pData, uiSize); 
    delete[] pData; 
    m_Mtx.unlock(); 
} 
boost::thread m_Thread; 
boost::mutex m_Mtx 
} 

это безопасно, чтобы использовать m_Thread таким образом, так как метод FlushToDisk может вызывается, когда созданный поток выполняет метод WriteToDisk. Или я должен делать что-то вроде:

m_Thread.join(); 
    m_Thread = boost::thread(&CSimSwcFastsimExporter::WriteToDisk, this, pTmp, uiSize); 

ли это второе решение будет медленнее, чем первый?

Из того, что я видел в http://www.boost.org/doc/libs/1_59_0/doc/html/thread/thread_management.html#thread.thread_management.tutorial «Когда объект подталкивание :: поток, который представляет собой поток выполнения уничтожаются поток отрывается. После того, как поток отрывается, он будет продолжать выполнение до вызова функции или отозвана объект, поставленный на строительство, завершен или программа завершена ». Так что в моем случае нити не должны прерываться или?

Заранее спасибо.

ответ

1

Второе решение приостанавливает основной поток, чтобы дождаться завершения потока записи. Вы могли бы удалить мьютексы, если идете этим путем. У вас гарантированно есть один файл, пишущий поток.

Первое решение позволит продолжить основной поток и создаст неконтролируемый поток писем - сериализуется на мьютексе. Хотя вы можете поверить, что это лучше (основной поток не будет ждать) Мне не нравится это решение по нескольким причинам.

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

Смежные вопросы