Ant*_*hea 10 c++ multithreading boost
我有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);
}
Run Code Online (Sandbox Code Playgroud)
线程破坏:
void MyManager::shutdown()
{
for (int i = 0; i < numberOfThreads; i++)
{
mThreads.at(i)->join();
delete mThreads.at(i);
}
mThreads.clear();
}
Run Code Online (Sandbox Code Playgroud)
工人:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
同步队列:
#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_;
};
Run Code Online (Sandbox Code Playgroud)
抛出的错误调用堆栈:
... 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++
Run Code Online (Sandbox Code Playgroud)
尝试将“try”向上移动(如下面的示例所示)。如果您的线程正在等待数据(在 waitingList.pop() 内),则可能在条件变量 .wait() 内等待。这是一个“中断点”,因此当线程被中断时可能会抛出异常。
void MyManager::worker()
{
while (true)
{
try
{
int current = waitingList.pop();
Object * p = objects.at(current);
p->calculateMesh(); //this task is internally locked by a mutex
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)