c-将线程的结果与递增的共享变量和条件同步



标题可能看起来不太清楚,但代码解释了自己:

int shared_variable;
int get_shared_variable() {
    int result;
    pthread_mutex_lock(&shared_variable_mutex);
    result = shared_variable;
    pthread_mutex_unlock(&shared_variable_mutex);
    return result;
}
void* thread_routine(void *arg) {
    while (get_shared_variable() < 5000) {
        printf();
        printf();
        sleep(2);
        int i = 0;
        while (pthread_mutex_trylock(&foo_mutexes[i]) != 0) {
            i++;
            pthread_mutex_lock(&foo_count_mutex);
            if (i == foo_count) {
                pthread_mutex_unlock(&foo_count_mutex);
                sleep(1); // wait one second and retry
                i = 0;
            }
            pthread_mutex_unlock(&foo_count_mutex);
        }
        pthread_mutex_lock(&shared_variable_mutex);
        shared_variable += 10;
        pthread_mutex_unlock(&shared_variable_mutex);
    }
    return NULL; 
}

我正在将thread_routine传递给pthread_create(相当标准),但我在结果的同步方面遇到了问题。基本上,问题是第一个线程检查while条件,它通过了,然后另一个线程检查它,它也通过了。然而,当第一个线程完成,shared_variable达到5000时,第二个线程还没有完成,它又加了10,最后结果变成5010(或者NUM_OF_THREADS-1*10,如果我运行了两个以上),而整个过程应该在5000结束。

另一个问题是,在// do some work中,我在屏幕上输出了一些东西,所以循环中的整个东西在数据库方面应该相当于事务。我似乎不知道如何解决这个问题,但我想我缺少了一些简单的东西。提前谢谢。

这个答案可能是你想要的,也可能不是。因为正如评论中所解释的,你对程序预期行为的描述是不完整的。如果没有确切的预期行为,很难给出完整的答案。但既然你问了,这里有一个基于所示代码的程序的可能结构。它所说明的主要原理是shared_variable的关键部分需要既是最小的又是完整的。

int shared_variable;
void* thread_routine(void *arg) 
{
    while (1) {
        pthread_mutex_lock(&shared_variable_mutex);
        if (shared_variable >= 5000) {
            pthread_mutex_unlock(&shared_variable_mutex);
            break;
        }
        shared_variable += 10;  
        pthread_mutex_unlock(&shared_variable_mutex);
        /* Other code that doesn't use shared_variable goes here */
    }
    return NULL; 
} 

最新更新