你好我有这个代码
class Triplets
{
public:
int nVal1;
int nVal2;
NodeT *ptrNode;
bool bUpdate;
Triplets()
{
cout << "creating empty triplet" << endl;
nVal2 = 0;
nVal1 = 0;
bUpdate = false;
ptrNode = NULL;
}
~Triplets()
{
cout << "destroying triplet" << endl;
delete ptrNode;
}
Triplets(int nVal1, int nVal2, bool bUpdate, NodeT *ptrNode)
{
cout << "creating triple with values" << endl;
this->nVal2 = nVal2;
this->nVal1 = nVal1;
this->bUpdate = bUpdate;
this->ptrNode = ptrNode;
}
};
此用法
void find_triplets(NodeT *ptrRoot)
{
if (ptrRoot != NULL)
{
find_triplets(ptrRoot->left);
find_triplets(ptrRoot->right);
cout << "find triplets and save them to the queue" << endl;
cout << " we hit a hot spot is null the root, nothing to see here move along boys" << endl;
if(ptrRoot->left != NULL && ptrRoot->right != NULL)
{
if (ptrRoot->left->done == true && ptrRoot->right->done == true)
{
cout << "we got one of 2 sons true so do something, this are the sons "<< ptrRoot->left->key_value << " " << ptrRoot->right->key_value << endl;
cout << "sum them and put it in the father and set it to true " << endl;
ptrRoot->key_value = ptrRoot->left->key_value + ptrRoot->right->key_value;
ptrRoot->done = true;
cout << "thread queue " << endl;
Triplets triplet(ptrRoot->left->key_value, ptrRoot->right->key_value, ptrRoot->done, ptrRoot);
qThreads.push(triplet);
}
}
}
}
这个主要的
MyThread mt;
mt.start();
mt.run();
cout << "sum = " << mt.sum(&bt) << endl;
THREADS_HOW_MANY = boost::thread::hardware_concurrency();
std::cout << THREADS_HOW_MANY << std::endl;
while (!bt.Values_to_do.empty())
{
cout << "da vals to sum are these " << bt.Values_to_do.front() << " and aready done " << bt.values_done.front() << endl;
bt.Values_to_do.pop();
bt.values_done.pop();
}
while(!mt.qThreads.empty())
{
cout << "da triplet are " << mt.qThreads.front().nVal1 << " " <<mt.qThreads.front().nVal2 << " "
<< mt.qThreads.front().ptrNode << " " << mt.qThreads.front().bUpdate
<< endl;
mt.qThreads.pop();
}
所有这些都给了我这个结果(显然是错误的)
done lets chek
find triplets
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
we got one of 2 sons true so do something, this are the sons 2 8
sum them and put it in the father and set it to true
thread queue
creating triple with values
destroying triplet
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
we got one of 2 sons true so do something, this are the sons 11 15
sum them and put it in the father and set it to true
thread queue
creating triple with values
destroying triplet
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
we got one of 2 sons true so do something, this are the sons 19976608 19976464
sum them and put it in
the father and set it to true
thread queue
creating triple with values
destroying triplet
the gran total is 19976320
现在我的q是为什么我的三元组对象没有被添加到队列中而是被销毁,这就是导致总和出来的所有混乱。感谢。
答案 0 :(得分:0)
Tl; dr - 弹出的是你有一个管理内存的析构函数:
~Triplets()
{
cout << "destroying triplet" << endl;
delete ptrNode;
}
还没有复制构造函数和赋值运算符。尝试实施这些。
答案 1 :(得分:0)
您似乎创建了Triplets
类的副本:
Triplets triplet(ptrRoot->left->key_value, ptrRoot->right->key_value, ptrRoot->done, ptrRoot);
qThreads.push(triplet);
根据qThreads
的声明,您首先要创建Triplets
名为triplet
的实例,然后将其推入qThreads
时将其复制。然后当范围离开时(在下一个}
),triplet
实例被销毁。这当然意味着你delete
里面的指针和副本指针现在将无效。