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