I thread x boost funzionano allo stesso tempo. Un thread di produzione riempie una coda sincronizzata con attività di calcolo. I thread dei consumatori compaiono attività e li calcola.Spegnere correttamente i thread di spunto
Fonte immagine: https://www.quantnet.com/threads/c-multithreading-in-boost.10028/
L'utente può terminare il programma durante questo processo, quindi ho bisogno di spegnere le mie discussioni correttamente. Il mio attuale approccio sembra non funzionare, poiché vengono lanciate eccezioni. È intuito che durante l'arresto del sistema tutti i processi dovrebbero essere uccisi e interrompere il loro compito corrente, indipendentemente da quello che fanno. Potresti mostrarmi, come potresti uccidere i fili?
inizializzazione Discussione:
for (int i = 0; i < numberOfThreads; i++)
{
std::thread* thread = new std::thread(&MyManager::worker, this);
mThreads.push_back(thread);
}
Distruzione Discussione:
void MyManager::shutdown()
{
for (int i = 0; i < numberOfThreads; i++)
{
mThreads.at(i)->join();
delete mThreads.at(i);
}
mThreads.clear();
}
Worker:
void MyManager::worker()
{
while (true)
{
int current = waitingList.pop();
Object * p = objects.at(current);
p->calculateMesh(); //this task is internally locked by a mutex
try
{
boost::this_thread::interruption_point();
}
catch (const boost::thread_interrupted&)
{
// Thread interruption request received, break the loop
std::cout << "- Thread interrupted. Exiting thread." << std::endl;
break;
}
}
}
Sincronizzato Coda:
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
template <typename T>
class ThreadSafeQueue
{
public:
T pop()
{
std::unique_lock<std::mutex> mlock(mutex_);
while (queue_.empty())
{
cond_.wait(mlock);
}
auto item = queue_.front();
queue_.pop();
return item;
}
void push(const T& item)
{
std::unique_lock<std::mutex> mlock(mutex_);
queue_.push(item);
mlock.unlock();
cond_.notify_one();
}
int sizeIndicator()
{
std::unique_lock<std::mutex> mlock(mutex_);
return queue_.size();
}
private:
bool isEmpty() {
std::unique_lock<std::mutex> mlock(mutex_);
return queue_.empty();
}
std::queue<T> queue_;
std::mutex mutex_;
std::condition_variable cond_;
};
La chiamata errore gettato stack:
... std::_Mtx_lockX(_Mtx_internal_imp_t * * _Mtx) Line 68 C++
... std::_Mutex_base::lock() Line 42 C++
... std::unique_lock<std::mutex>::unique_lock<std::mutex>(std::mutex & _Mtx) Line 220 C++
... ThreadSafeQueue<int>::pop() Line 13 C++
... MyManager::worker() Zeile 178 C++
Due cose: isEmpty non è bloccato, e le dimensioni() potrebbe avere un'implementazione più semplice: dopo mutex è bloccato si può semplicemente tornare queue_.size() (e mlock destructor rilascia il mutex) – marom
@marom grazie, corretto il mio codice. L'errore è ancora lì. – Anthea
Due cose: isEmpty e le dimensioni potrebbero non essere pubbliche. Qualsiasi cosa riportino può essere non valida quando valutata dal chiamante. A meno che non siano usati in privato, devono essere rimossi. – stefan