【发布时间】:2013-06-30 23:19:51
【问题描述】:
我正在尝试使用 boost 库对一段代码进行多线程处理。问题是每个线程都必须访问和修改几个全局变量。我正在使用互斥锁来锁定共享资源,但程序最终会花费更多时间而不是多线程。有关如何优化共享访问的任何建议?
非常感谢!
在下面的示例中,*choose_ecount* 变量必须被锁定,并且我不能将它从循环中取出并锁定它以仅在循环结束时进行更新,因为它需要最新的值里面函数。
for(int sidx = startStep; sidx <= endStep && sidx < d.sents[lang].size(); sidx ++){
sentence s = d.sents[lang][sidx];
int senlen = s.words.size();
int end_symb = s.words[senlen-1].pos;
inside(s, lbeta);
outside(s,lbeta, lalpha);
long double sen_prob = lbeta[senlen-1][F][NO][0][senlen-1];
if (lambda[0] == 0){
mtx_.lock();
d.sents[lang][sidx].prob = sen_prob;
mtx_.unlock();
}
for(int size = 1; size <= senlen; size++)
for(int i = 0; i <= senlen - size ; i++)
{
int j = i + size - 1;
for(int k = i; k < j; k++)
{
int hidx = i; int head = s.words[hidx].pos;
for(int r = k+1; r <=j; r++)
{
int aidx = r; int arg = s.words[aidx].pos;
mtx_.lock();
for(int kids = ONE; kids <= MAX; kids++)
{
long double num = lalpha[hidx][R][kids][i][j] * get_choose_prob(s, hidx, aidx) *
lbeta[hidx][R][kids - 1][i][k] * lbeta[aidx][F][NO][k+1][j];
long double gen_right_prob = (num / sen_prob);
choose_ecount[lang][head][arg] += gen_right_prob; //LOCK
order_ecount[lang][head][arg][RIGHT] += gen_right_prob; //LOCK
}
mtx_.unlock();
}
}
【问题讨论】:
-
不是没有看到一些代码...
-
你能把 mutext 从最里面的循环中拿出来并向上移动一个级别吗?
-
是的。这有点帮助。
-
下一个问题是您是否可以将互斥锁/解锁更多级别移动到围绕 for (int size = ... 循环。看来您进行初始化然后快速循环事情然后循环回来,做更多的初始化,然后再次运行循环。此外,很高兴知道函数 get_choose_prob 是如何使用它的参数和任何全局变量来知道它是否正在做一些有副作用的事情,尤其是变量 s。
标签: c++ multithreading boost