c ++线程未在函数结束时终止

时间:2016-10-27 07:03:31

标签: c++ multithreading stack queue

我是C ++和线程的新手。我有一个任务,我们应该创建一个多线程版本的eartosthenes算法筛子来查找素数。我们被指示使用线程安全队列来完成此任务。主线程应该创建一个无限的数字序列,从2 - 无穷大。主线程还将创建一个过滤线程。此过滤器线程从队列q0读取并将所有不是N的倍数的数字放入另一个队列(q1)。 Q1将被传递给另一个线程,该线程也将过滤掉数字并将它们放入另一个队列。这种情况一直持续到它找到正确数量的素数然后程序终止。或者至少它应该。由于某种原因,最后一个帖子中存在问题。它不会在函数结束时终止。它在函数中随机跳转。使用gdb,它一直告诉我线程无法找到当前函数的边界。我不能为我的生活弄清楚出了什么问题。我认为它可能与弄乱我的堆栈的东西有关?

void filtering(safeQueue& q1, bool& running, int& userNum, int& primes){
    safeQueue q2;
    int num;
    int popped;

    q1.pop(num);

    cout<< "Prime is found: "<<num <<endl;
    primes++;

    if(primes >= userNum){
        running = false;
        return;
    }

    q1.pop(popped);
    if((popped%num)!= 0)
        q2.push(popped);
    if(running){
        thread filter(filtering, ref(q2), ref(running), ref(userNum), ref(primes));

        while(running){
            q1.pop(popped);
            if((popped%num)!=0)
                q2.push(popped);
        }
        filter.join();
        return;
    }
    return;
}

int main(int argc, const char * argv[]) {
    int num;
    int i = 3;
    safeQueue q0;
    bool running = true;
    int primes = 0;
    int userNum = 0;

userNum = getInput();
q0.push(2);

    thread filter2(filtering, ref(q0), ref(running), ref(userNum), ref(primes));

    while(running){
        q0.push(i);
        i++;
    }
    filter2.join();
    return 0;
}

这是我的safeQueue类(cpp)

#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>
#include "safeQueue.hpp"

using namespace std;
void safeQueue::pop(int& data)
{
    unique_lock<mutex> lock(mu);
    while(q.empty())
    {
        conVar.wait(lock);
    }
    data = q.front();
    q.pop();
}
void safeQueue::push(const int& data)
{
    unique_lock<mutex> lock(mu);
    q.push(data);
    lock.unlock();
    conVar.notify_one();
}

safeQueue(标题)

#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>

using namespace std;
class safeQueue
{
public:
    void pop(int& data);

    void push(const int& data);

private:
    queue<int> q;
    mutable mutex mu;
    condition_variable conVar;
};

此程序也必须在没有内存泄漏的情况下运行。如果我可以正确地让线程关闭,那么我很肯定我不必担心内存泄漏。任何帮助将不胜感激。

0 个答案:

没有答案