부스트 라이브러리를 사용하여 코드를 멀티 스레드하려고합니다. 문제는 각 스레드가 두 개의 전역 변수를 액세스하고 수정해야한다는 것입니다. 공유 리소스를 잠그기 위해 뮤텍스를 사용하고 있지만 프로그램이 멀티 스레드되지 않은 경우 더 많은 시간이 소요됩니다. 공유 액세스를 최적화하는 방법에 대한 조언이 있으십니까?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
가장 안쪽 루프에서 뮤텍스를 들어 올려 레벨 위로 옮길 수 있습니까? –