-1

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

线程

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

try { // n try...

主要的

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

在主要我正在创建一个节点根,然后在线程中节点被赋予序列并有一个布尔值更改为 true,如:

ppa::Node *root;

在线程正在工作(线程组)中,我可以根据需要获取并设置该布尔值,但是当线程组以 join all 结束时(这是 boost),指针根在这一行给我 0

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

在此继续之后,节点再次充满了一些东西,所以我想问的是为什么我的节点指针没有反映线程中的变化,是设计还是我错了(可能是第二个),我该怎么办一个全局根节点可以解决我的问题,但为什么呢?

4

1 回答 1

1

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

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

    tuple_compare(deque_done.at(i));

    result_mutex.unlock();

}

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

boost::recursive_mutex result_mutex;

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

如果你真的坚持设计一个允许从多个线程重入的递归算法,也许你可以使用boost::shared_mutex, 和boost::shared_lock/boost::upgradeable_lock作为读锁,和boost::unique_lock/boost::upgrade_to_unique_lock用于写访问。您可以点击此链接作为示例。

于 2012-07-31T07:51:43.093 回答