尽管互斥锁,线程中的种族条件

问题描述 投票:0回答:1

此代码计算数组中所有整数的总和,将工作平均分配到多个线程之间。但是,每隔一段时间,线程号以及线程的localsum就会混乱。我假设这是因为void * param和globalindex被多个线程同时访问。即使我在此代码中互锁了每个全局变量,也没有发生这样的事实。我该如何解决?

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

using namespace std;
int y =0;
int sum=0;
int array[1000000];
int x=0;
int leftoverHandle = 0;
int globalindex = 0;
int eachThreadHandles =0;

void* add(void* param){
    pthread_mutex_lock(&mutex);
    int localindexup = globalindex + eachThreadHandles;
    int localindexdown = globalindex;
    int localsum=0;
    long localparam = (long)param;

    if(y != leftoverHandle ){
            localindexup++;
            y++;

    }
    pthread_mutex_unlock(&mutex);


    while(localindexdown<localindexup){

            pthread_mutex_lock(&mutex);
            sum = sum+array[localindexdown];
            localsum = localsum+array[localindexdown];
            localindexdown++;
            pthread_mutex_unlock(&mutex);


    }




    pthread_mutex_lock(&mutex);
    globalindex = localindexdown;
    printf("Thread %ld", localparam);
    printf(": %d\n", localsum);
    pthread_mutex_unlock(&mutex);
}
c++ multithreading pthreads race-condition
1个回答
0
投票

作为我的评论的后续内容,将条件置于互斥区域内将解决问题:

while(1)
{
            pthread_mutex_lock(&mutex);
            if(localindexdown<localindexup)
               break; 
            sum = sum+array[localindexdown];
            localsum = localsum+array[localindexdown];
            localindexdown++;
            pthread_mutex_unlock(&mutex);
}
© www.soinside.com 2019 - 2024. All rights reserved.