指针指向的节点没有变化

时间:2012-07-31 06:55:44

标签: c++ multithreading pointers boost

我有一个问题,我在我的线程代码中有这个指针,并且它们在那里被修改,但是当它返回到main时,更改不是这样的:

线程

void threaded_function(Model_factory &mf, ppa::Node *root) { // threads management

try { // n try...

主要

 int main(int argc, char *argv[]) { ...

主要是我创建一个节点根,然后在线程中节点被赋予序列并且有一个bool变为true,如:

ppa::Node *root;

在线程正在工作(一个线程组)我可以按照自己的意愿获取并设置bool,但是当线程组以join all(这是boost)结束时,指针根在这一行上给我0

cout << root->has_sequence() << endl;

在此之后,节点再次被某些东西填满,所以我想问的是为什么我的节点指针没有反映线程中的变化,是设计还是我错了(可能是第二个)和什么我应该做一个全局根节点来修复我的问题,但为什么呢?

1 个答案:

答案 0 :(得分:1)

如果您遇到竞争条件,则必须怀疑您正在访问已解锁的关键部分。我注意到你手动锁定和解锁你的互斥变量。这可能会导致代码出错。例如,这种结构看起来特别令人震惊:

for (int i = 0; i < deque_done.size(); i++) {

    tuple_compare(deque_done.at(i));

    result_mutex.unlock();

}

您可以考虑使用boost::recursive_mutexboost::recursive_mutex::scoped_lock来管理锁定获取和释放,而不是手动锁定和解锁。

boost::recursive_mutex result_mutex;

void foo () {
    boost::recursive_mutex::scoped_lock lock(result_mutex);
    //...
}

如果你真的坚持设计一个允许来自多个线程的重入的递归算法,也许你可以使用boost::shared_mutexboost::shared_lock / boost::upgradeable_lock作为读锁,并且boost::unique_lock / boost::upgrade_to_unique_lock用于写入权限。 You can follow this link for an example.