我有一个问题,我在我的线程代码中有这个指针,并且它们在那里被修改,但是当它返回到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;
在此之后,节点再次被某些东西填满,所以我想问的是为什么我的节点指针没有反映线程中的变化,是设计还是我错了(可能是第二个)和什么我应该做一个全局根节点来修复我的问题,但为什么呢?
答案 0 :(得分:1)
如果您遇到竞争条件,则必须怀疑您正在访问已解锁的关键部分。我注意到你手动锁定和解锁你的互斥变量。这可能会导致代码出错。例如,这种结构看起来特别令人震惊:
for (int i = 0; i < deque_done.size(); i++) {
tuple_compare(deque_done.at(i));
result_mutex.unlock();
}
您可以考虑使用boost::recursive_mutex
和boost::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
用于写入权限。 You can follow this link for an example.