У меня есть x ускорение потоков, которые работают в одно и то же время. Один поток производителя заполняет синхронизированную очередь заданиями вычисления. Потребительские потоки выталкивают задачи и вычисляют их.Завершение поднять потоки правильно
Источник изображения: https://www.quantnet.com/threads/c-multithreading-in-boost.10028/
Пользователь может закончить программка во время этого процесса, так что мне нужно выключение моих тема правильно. Мой нынешний подход, похоже, не работает, поскольку выбрасываются исключения. Предполагается, что при выключении системы все процессы должны быть убиты и остановить их текущую задачу независимо от того, что они делают. Не могли бы вы показать мне, как вы будете убивать теки?
Инициализация Тема:
for (int i = 0; i < numberOfThreads; i++)
{
std::thread* thread = new std::thread(&MyManager::worker, this);
mThreads.push_back(thread);
}
Destruction Тема:
void MyManager::shutdown()
{
for (int i = 0; i < numberOfThreads; i++)
{
mThreads.at(i)->join();
delete mThreads.at(i);
}
mThreads.clear();
}
работник:
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;
}
}
}
Синхронное Очередь:
#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_;
};
Заброшенная стек вызовов ошибка:
... 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++
две вещи: IsEmpty не закрывается, и размер() может иметь более простую реализацию: после того, как мьютекс заблокирован вы можете просто вернуть queue_.size() (и MLOCK деструктор освобождает мьютекс) – marom
@marom спасибо, исправил мой код. Ошибка все еще существует. – Anthea
Две вещи: isEmpty и размер не могут быть общедоступными. Независимо от того, что они сообщают, может быть недействительным при оценке вызывающего абонента. Если они не используются в частном порядке, они должны быть удалены. – stefan