正确关闭提升螺纹

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)

mar*_*rom 0

尝试将“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)