我想使用boost庫多線程一段代碼。問題是每個線程都必須訪問和修改幾個全局變量。我正在使用互斥鎖來鎖定共享資源,但當程序不是多線程時,程序最終需要更多的時間。有關如何優化共享訪問的任何建議?C++多線程共享資源
非常感謝!
在下面的例子中,* 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();
}
}
不是沒有看到一些代碼... –
在一些代碼中添加 – langLord
你可以將mutext從最內部的循環中提出並將其向上移動一個級別? –